2022. 3. 12. 14:27ㆍ강의 정리/Django REST Framework
장고(Django)를 배우기 시작한 입문자이시거나, 또는 배우고 싶은 생각이 있으신 분은 위 출처의 강의를 적극 추천드립니다!!!
Django JSON 응답뷰 만들기
REST API 스타일로 포스팅 API 서비스를 제공할 때
/post/ 주소
- GET 방식 요청 : 목록 응답
- POST 방식 요청 : 새 글 생성하고, 확인 응답
예시 코드
def post_list(request):
if request.method == 'POST':
# POST 일시 새 글 저장을 구현
form = PostForm(request.Post, request.FILES)
if form.is_valid():
post = form.save()
# JsonResponse은 json 응답을 만드는데 사용합니다.
# 유효성 검사에 통과했다면
return JsonResponse(post)
# 유효성 검사에 통과하지못했다면
return JsonResponse(form.errors)
else:
# GET 일시 목록 응답을 구현
return JsonResponse(Post.objects.all())
/post/10/ 주소
- GET 방식 요청 : 10번 글 내용 응답
- PUT 방식 요청 : 10번 글 수정 / 저장하고, 확인 응답
- DELETE 방식 요청 : 10번 글 삭제하고, 확인 응답
예시 코드
# 특정 pk에 대해 접근
def post_detail(request, pk):
if request.method == 'PUT':
# PUT 일시 해당 PK글 수정, 갱신을 구현
# QueryDict은 사전형 타입의 클래스로 같은 키에 대해 복수의 값을 갖도록 커스터마이즈하게 해준다.
put_data = QueryDict(request.body)
# 해당 pk글을 수정할 instance로 둡니다.
form = PostForm(put_data, instance=post)
if form.is_valid():
post = form.save()
# JsonResponse은 json 응답을 만드는데 사용합니다.
# 유효성 검사에 통과했다면
return JsonResponse(post)
# 유효성 검사에 통과하지못했다면
return JsonResponse(form.errors)
elif request.method == 'DELETE':
# DELETE 일시 해당 PK글 삭제를 구현
post.delete()
return HTTPResponse()
else:
# GET 일시 해당 PK글 내용 응답을 구현
return JsonResponse(Post.objects.all())
총 5개의 뷰 처리가 필요해집니다.
_ 만약 다른 모델에 대해서 동일한 기능을 구현한다면, Model/Form을 제외하고는 위 코드와 같이 거의 정형화된 패턴입니다. Django REST Framework (=DRF)는 이런 정형화 된 중복을 줄일 수 있도록 도와주는 CBV를 비롯해 다양한 기능을 지원합니다.
참고
HTTP 동사(메소드)
_GET 메서드는 특정 리소스의 표시를 요청합니다. GET을 사용하는 요청은 오직 데이터를 받기만(조회) 합니다.
_POST 메서드는 특정 리소스에 엔티티를 제출할 때 쓰입니다, 즉 새 리소스를 생성 요청합니다. 이는 종종 서버의 상태의 변화나 부작용을 일으킵니다.
_PUT 메서드는 기존 리소스를 대체하고, 요청 본문에 갱신할 리소스 정보를 제공합니다.
_DELETE 메서드는 특정 리소스를 삭제합니다.
_PATCH 메서드는 리소스의 부분만을 수정하는 데 쓰입니다.
https://developer.mozilla.org/ko/docs/Web/HTTP/Methods
DRF 설치하기
https://www.django-rest-framework.org/
0. 터미널에 아래 코드를 입력해줌으로서 설치를 해줍니다.
pip install djangorestframework~=3.11.0
추가로 항상 requirements.txt를 통해서 사용하고 있는 skill들을 기록해놓아야 합니다.
django~=3.0.0
djangorestframewrok~=3.11.0
1. settings.INSTALLED_APPS에 "rest_framework"를 추가해줍니다.
INSTALLED_APPS = [
# Django Apps
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.humanize',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
# Third Apps
'debug_toolbar',
'bootstrap4',
'django_pydenticon',
'easy_thumbnails',
'rest_framework', # 추가
# Local Apps
'accounts',
'insta',
]
2. ulrpatterns 다음 패턴에 추가해줍니다.
urlpatterns = [
path('api-auth', include('restframework.ulrs')), # 추가
]
DRF 샘플 구현하기 (매우 기본 샘플)
myapp/models.py
from django.db import models
# Create your models here.
class Post(models.Model):
message = models.TextField()
created_at = models.DateTimeField(auto_now_add=True)
updated_at = models.DateTimeField(auto_now=True)
myapp/serializers.py
from rest_framework.serializers import ModelSerializer
from .models import Post
class PostSerializer(ModelSerializer):
class Meta:
model = Post
fields = '__all__'
myapp/views.py
from rest_framework.viewsets import ModelViewSet
from .serializers import PostSerializer
from .models import Post
class PostViewSet(ModelViewSet):
queryset = Post.objects.all()
serializer_class = PostSerializer
"""
DRF를 사용하지 않았을 때의 작업 방법
def post_list(request):
# 최소 2개의 분기 ex) POST, GET
pass
def def_detail(request, pk):
# request.method # => 최소 3개 분기 ex) GET, PUT, DELETE
pass
"""
myapp/urls.py
from django.urls import path, include
from rest_framework.routers import DefaultRouter
from . import views
# 1개의 CBV에서 2개의 url을 만드는 코드
router = DefaultRouter()
router.register('post', views.PostViewSet) # 2개의 URL을 만들어줌.
# 위의 과정까지 마치면
# router.urls에 리스트 형태로 url들이 저장되어있음.
urlpatterns = [
path('', include(router.urls)),
]
다양한 HTTP 클라이언트 프로젝트
_ 유저가 웹브라우저를 통해 웹페이지간 이동할때
_ 웹 프론트엔드에서 JavaScripts를 통해 호출 할 때 ex) Ajax
_ Android/ios 앱 코드를 통한 호출 할 때
_ 웹 요청 개발 프로그램을 통한 호출 할 때 ex) Postman, request ,HTTPie
그 중 HTTPie를 통한 HTTP 요청
https://codermun-log.tistory.com/144
설치는 아래 코드와 같습니다.
pip3 install httpie
HTTPie 명령어
쉘 > http GET 요청할주소 GET인자명==값 GET인자명==값
쉘 > http --json POST 요청할주소 GET인자명==값 GET인자명==값 POST인자명==값 POST인자명==값
-> 옵션 지정 : application/json -> 요청 데이터를 JSON 직렬화
쉘 > http --form POST 요청할주소 GET인자명==값 GET인자명==값 POST인자명==값 POST인자명==값
-> 옵션 지정 : multipart/form-data
쉘 > http PUT 요청할주소 GET인자명==값 GET인자명==값 PUT인자명==값 PUT인자명==값
쉘 > http DELETE 요청할주소 GET인자명==값 GET인자명==값
'강의 정리 > Django REST Framework' 카테고리의 다른 글
DRF ViewSet과 Router (0) | 2022.07.13 |
---|---|
DRF mixins 상속을 통한 APIView (0) | 2022.07.12 |
DRF로 APIView, Json 응답뷰 만들기 (0) | 2022.07.11 |
Django JSON 직렬화 (0) | 2022.03.22 |
Django API와 REST (0) | 2022.03.10 |