Programming/장고(django) - API

장고(django)/ 뷰(V, views)

esoog Polaris 2023. 6. 2. 23:09
# 참고로 웹과 데이터를 연결하기 위해 서버가 실행된 상태에서 가장 먼저 접하는 루트는
# urls.py를 먼저 매핑 시켜야 한다. (뷰의 함수가 실행될 페이지)
from django.shortcuts import render
# 템플릿 시스템서 웹페이지 렌더링(페이지출력)에 특화
from django.http import HttpResponse
# 직접 http 응답생성. 문자나 파일 정보를 반환. 사용은 아래서 참조
from rest_framework.response import Response
# api 응답 및 반환. 객체를 json,xml 등으로 시리얼라이즈, http 상태 확인
from rest_framework.decorators import api_view
# 말 그대로 drf에서 api뷰를 정의하기 위한 데코레이터(get, post 사용 등)
from rest_framework import status
# http 상태 코드 사용 위한 함수.
from .models import All_data, Rel_data
from .serializers import All_Serializer
# 해당 폴더 시리얼라이저 사용
from django.db.models import Q
# 장고 데이터베이스 모델 정보조회 함수
# 사실 데이터 베이스 관련 함수는 from .models import * 로 뽑아두는 게 낫다.
import os
# 시스템 경로
def home(request):
return render(request, 'home.html')
@api_view(['GET'])
# get 방식 api통신을 위해, 데코레이터 사용. ['GET']이 파라미터.
def get_data(request):
datas = All_data.objects.all()
# 데이터모델의 함수로서 .objects.all()는 객체들의 모든 정보를 추출 변수화
# 값은 <QuerySet[<레코드1>,<레코드2>,...]> 이렇게 나온다.
# 데이터모델의 함수 기본 몇 가지.
# .filter(조건) : 조건으로 필터링. 여기에 Q함수 사용.
# .order_by('필드명') : 필드기준 정렬
# .count() : 레코드 수(보통 앞에 .filter(조건) 처리 후 사용)
# .delete() : 레코드 삭제(보통 앞에 .filter(조건) 처리 후 사용)
serializer = All_Serializer(datas, many=True)
# 시리얼라이저(직렬화) 구현 파라미터로( 직렬화할 데이터 변수, (if 객체가 여러개?)many=True )
# 이렇게 하면 데이터가 직렬화 데이터, json 이나 다른 형태로 변환
# 여기서 데이터의 객체는 테이블의 레코드로 보면 된다.(행)
return Response(serializer.data)
# 그 직렬화 변환된 녀석의.data를 Response()로 구현
@api_view(['POST'])
# 이번에는 post방식
def post_data(request):
datas = request.data
serializer = All_Serializer(data=datas)
# 하나의 레코드 정보로 객체가 생성되어 입력될테니.
if serializer.is_valid():
# 여기서 시리얼라이저 함수 .is_valid()가 등장하는데,
# 데이터 유효성 검사 함수이다. 따라서 form모듈처럼 웹폼을 검증할 수 있다.
# 다만, form모듈은 웹폼 작업에 더 특화(html 래퍼 자동 생성)
name = serializer.validated_data['name']
# 시리얼라이저 유효성 통과한 데이터의['필드값']을 변수로 할당
city = serializer.validated_data['city']
user = serializer.validated_data['user']
if All_data.objects.filter(Q(name=name) | Q(user=user) | Q(city=city)).exists():
# 그래서 만약 All_data데이터의 객체에 필터링 하여,
# All_data데이터 필드와 위의 변수값이 일치하는 것이.존재하냐():
# 일반적으로 Q(조건) 값은 True | False
# Q(변수__icontains = 변수) : __icontains를 붙이면, 대소문자 구분 없이 기냐 아니냐?
datas2 = Rel_data(name=name, city=city, user=user)
# 새로운 Rel_data()객체를 생성하고 필드값을 할당 하고 변수로 지정.
datas2.save()
else:
serializer.save()
return Response(serializer.data, status=status.HTTP_201_CREATED)
# Response(상태인자로 status를 활용하여, 코드로 나타냄.)
return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)
# serializer.errors : 시리얼라이저 에러메시지 출력
def get_image(request, image_name):
# 인자로 image_name을 받는데 이게 어디서 오냐면, urls.py에서 건너오게 만든다.
# 이건 기술적인 부분.
image_path = os.path.join('images/',image_name)
# os.path.join()을 활용하여 경로를 합해서 반환한다.
with open(image_path, 'rb') as f:
# 파일을 읽을 때, 이진파일을 읽을 땐('rb')
image_data = f.read()
# .read()로 읽어낸다.
return HttpResponse(image_data, content_type='image/*')
# 그리고 HttpResponse()를 활용하여, 객체를 타입을 지정해서 출력한다.
# content_type='image/*'는 이미지의 모든 타입
view raw views.py hosted with ❤ by GitHub

 

반응형