This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
# 참고로 웹과 데이터를 연결하기 위해 서버가 실행된 상태에서 가장 먼저 접하는 루트는 | |
# 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/*'는 이미지의 모든 타입 |
반응형
'Programming > 장고(django) - API' 카테고리의 다른 글
장고(django)/ 회원가입 및 로그인 기능(auth 모듈 관련) (0) | 2023.06.04 |
---|---|
장고(django)/ 검색 기능(Q 모듈 관련) (0) | 2023.06.04 |
장고(django)/ 시리얼라이저(Serializers, api통신 관련) (0) | 2023.06.02 |
장고(django)/ 모델(M, model, 데이터 구축 관련) (0) | 2023.06.02 |
장고(django)/ 템플릿(T) (0) | 2023.06.02 |