django-rest-framework (DRF)설치
- pip install djangorestframework~=3.11.0
- settings.py 에 있는 INSTALLED_APPS에 "rest_framework" 추가
- urls.py에 있는 urlpatterns에 path('api-auth/', include('rest_framework.urls')) 추가 → django.contrib.auth의 login,logout view 사용
한 모델(ex. Post) 에 대한 API 서비스 제공할때 기존 url 설계
새 포스팅 내용 등록하고 확인 응답 → /post/new/ 주소로 POST 요청
포스팅 목록 및 검색 응답 → /post/ 주소로 GET 요청
10번 포스팅 내용 응답 → /post/10 주소로 GET 요청
10번 포스팅 내용 갱신하고, 확인응답 → /post/10/update/ 주소로 POST 요청
10번 포스팅 내용 삭제하고, 확인응답 → /post/10/delete/ 주소로 POST 요청
REST API 스타일로 재설계
주소는 2개 & 총 5개의 뷰 처리가 필요
- /post/ 주소
- GET 방식 요청 : 목록 응답
- POST 방식 요청 : 새 글 생성하고 확인 응답
- PUT 방식 요청 ( PATCH 방식 요청) : X
- DELETE 방식 요청 : X
- /post/10/주소
- GET 방식 요청 : 10번 글 내용 응답
- POST 방식 요청 : X
- PUT 방식 요청 ( PATCH 방식 요청) : 10번 글 수정/저장하고, 확인 응답
- DELETE 방식 요청 : 10번 글 삭제하고, 확인 응답
# models.py
from django.db import models
class Post(models.Model):
message = models.TextField()
# forms.py
from django import forms
class PostForm(forms.ModelForm):
class Meta:
model = Post
fields = '__all__'
# views.py
def post_list(request):
# 새 글 저장
if request.method == 'POST':
form = PostForm(request.POST, request.FILES)
if form.is_valid():
post = form.save()
return JsonResponse(post)
return JsonResponse(form.errors)
else:
# 글 목록 응답
return JsonResponse(Post.objects.all())
def post_detail(request, pk):
post = get_object_or_404(Post, pk=pk )
if request.method == 'PUT':
# 특정 글 수정
put_data = QueryDict(request.body)
form =PostForm(put_data, instance=post)
if form.is_valid():
post = form.save()
return JsonResponse(post)
return JsonResponse(form.errors)
elif request.method == 'DELETE' :
# 특정 글 삭제
post.delete()
return HttpResponse()
else:
# 특정 글 내용 응답
return JsonResponse(post)
위의 url 설계를 위와 같은 코드로 구현할 수 있지만,
다른 모델에 대해서도 동일한 기능을 구현한다면 거의 똑같은 패턴이 반복됨
→ django-rest-framework 에서는 이런 정형화된 중복을 줄일 수 있도록 클래스 기반 뷰 등 다양한 기능 지원
# serializers.py
from rest_framework.serializers import ModelSerializer
from .models import Post
class PostSerializer(ModelSerializer):
class Meta:
model = Post
fields = '__all__'
# 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
# urls.py
from django.urls import include
from rest_framework.routers import DefaultRouter
from . import views
router = DefaultRouter()
router.register('post', views.PostViewSet) # 2개의 url 패턴 만들어준다
urlpatterns = [
path('', include(router.urls)) # router.urls에 url 패턴이 리스트 형태로 존재
]
forms.py를 삭제하고 serializers.py에 위와 같은 내용을 구현하고,
views.py의 긴 코드를 ModelViewSet을 이용하여 간단하게 바꿀 수 있다. 단 urls.py에서 router를 사용해야한다
HTTP 클라이언트 프로그램
- 웹 브라워를 통해 웹 페이지 간 이동할 때
- 웹 프론트엔드에서 JavaScript의 Ajax 통해 호출
- Android/IOS 앱 코드를 통해 호출
- 웹 요청 개발 프로그램을 통한 호출
- GUI 프로그램 : Postman
- CLI 프로그램 : cURL, HTTPie
- 라이브러리 : requests
HTTPie 사용법
설치 : pip install httpie
- http GET 요청주소 GET인자명==값 GET인자명==값
메소드 생략하면 GET
- http --json POST 요청주소 GET인자명==값 GET인자명==값 POST인자명=값 POST인자명=값
- http --form POST 요청주소 GET인자명==값 GET인자명==값 POST인자명=값 POST인자명=값
인코딩 방법의 차이가 있는 2종류의 POST 요청 :
--form : multipart/form-data
--json or 생략 : appllication/json 요청데이터를 JSON 직렬화
- http PUT 요청주소 GET인자명==값 GET인자명==값 PUT인자명=값 PUT인자명=값
- http DELETE 요청주소 GET인자명==값 GET인자명==값
ex)
http :8000 → 목록조회
http --form POST :8000 message="hello world" → 새 포스팅 등록
http :8000/1 → 1번 포스팅 조회
http DELETE :8000/1/ → 1번 포스팅 삭제