장고에서는 뷰 파일과 url을 설정하여 클라이언트로부터 들어오는 HTTP GET 및 POST 요청을 처리할 수 있습니다.
HTTP 요청에는 크게 GET
과 POST
가 존재하며, 둘의 가장 큰 차이점은 바디(body)의 존재 유무입니다. GET
요청에는 헤더만 있고 바디가 없으며, POST
요청에는 헤더와 바디가 모두 존재합니다.
HTTP GET 요청 처리
HTTP GET
요청은 URL에 쿼리 파라미터를 추가하여 전송합니다. 즉, 다음과 같이 URL의 마지막에 ?
를 붙인 다음 파라미터와 값을 넣어 요청을 전송합니다.
http://127.0.0.1:8000/skin/products?id=1
만약, 두 개 이상의 파라미터를 전송하려고 한다면 다음과 같이 &
을 사용합니다.
http://127.0.0.1:8000/skin/products?id=1&skinType=dry
이제 해당 URL로 들어오는 GET
요청을 처리하기 위해 뷰 파일 작업이 필요하겠죠. 제품 정보를 출력하는 SkinProductView
가 있다고 해보겠습니다. 해당 클래스 안에 get
요청을 처리하는 함수를 다음과 같이 선언할 수 있습니다.
1 from django.views import View
2 from django.http import JsonResponse
3
4 from .models import Product
5
6 class SkinProductView(View):
7 def get(self, request, *args, **kwargs):
8 product_id = request.GET.get('id', None)
9 skintype = request.GET.get('skinType', None)
10
11 product = Product.objects.get(id=product_id)
12
13 product_information = {
14 "product_id": product.id,
15 "skin_type": product.skintype
16 }
17
18 return JsonResponse({"message": product_information}, status=200)
하나씩 코드를 살펴보도록 하겠습니다. 6번째 줄은 View
클래스를 상속받아 SkinProductView
를 선언하는 것입니다. 여기서 View
는 장고에서 제공하는 모듈입니다.
7번째 줄은 get
요청을 처리할 함수로 request
는 HTTP 요청을 의미하며 *args
는 가변인자 처리, **kwargs
는 키워드인자 처리입니다. 만약, 이 부분이 잘 이해가 되지 않는다면 아래 포스팅 링크를 참조해보셔도 좋을 거 같습니다.
8번째 줄의 request.GET.get('id', None)
은 GET
요청을 통해 들어온 HTTP request
를 받겠다는 것이며, 쿼리 파라미터 id
키에 해당하는 값을 파이썬의 메소드(get
) 를 통해 얻겠다는 것입니다. 쿼리 파라미터 옆의 None
은 요청이 들어오지 않으면 기본값으로 None
을 지정하겠다는 것을 의미합니다.
11번째 줄은 product_id
변수로 받은 id
를 통해 Product
에 접근하여 일치하는 제품 번호를 갖는 객체를 호출하는 것입니다. 13~16번 줄은 이를 product_information
에 객체의 형태로 담아 전송하기 위한 과정입니다.
마지막으로 18번째 줄은 JsonResponse
를 통해 HTTP GET
요청에 대한 응답으로 JSON 형식의 데이터를 제공하고, 상태 코드 200
을 반환하겠다는 것입니다.
이제 장고의 URL 부분도 처리를 해줘야겠죠. 다음과 같이 URL에서도 쿼리 파라미터를 처리할 수 있게 설정해주면, 의도했던 대로 GET
요청을 처리할 수 있습니다.
from django.urls import URLPattern, path
urlpatterns = [
path('skin/products/<int:product_id>', ProductView.as_view()),
]
HTTP POST 요청 처리
POST
요청은 다음과 같이 바디에 키와 값을 담아 진행합니다. 예를 들어, POST
요청으로 새로운 상품을 데이터베이스에 등록하고자 한다고 해보겠습니다. 다음과 같이 뷰 파일과 URL을 작업할 수 있습니다.
1 import json
2
3 from django.views import View
4 from django.http import JsonResponse
5
6 class SkinProductView(View):
7 def post(self, request, *args, **kwargs):
8 try:
9 data = json.loads(request.body)
10
11 product_id = data["id"]
12 skintype = data["skintype"]
13
14 Product.objects.create(id=product_id, skintype=skintype)
15
16 return JsonResponse({"message": f"PRODUCT_{product_id}_REGISTRED"}, status=200)
17 except KeyError:
18 return JsonResponse({"message": KEY_ERROR}, status=400)
POST
요청은 JSON 형태로 바디에 담겨 들어오기 때문에 GET
요청을 처리하는 것과는 조금 다릅니다. 9번째 줄의 data = json.loads(request.body)
는 JSON 형태로 들어오는 request
의 body
를 파이썬에서 읽어올 수 있도록 data
에 담는 과정입니다. 이후에는 해당 객체를 파이썬의 객체처럼 활용하여 키와 값에 접근할 수 있습니다.
14번째 줄은 쿼리셋 메소드를 사용하여 데이터베이스에 새로운 제품을 생성(create
)하는 코드입니다. 이후, 데이터베이스 등록이 잘 됐다면 16번째 줄에서처럼 200
상태 코드와 함께 성공 메시지를 반환해 줄 수 있습니다.
18번째 줄은 KeyError
가 발생하는 경우를 처리해주는 것인데요. POST
요청의 경우에는 바디에서 받기로 설정해둔 키를 사전에 설정해두기 때문에, 이를 전달해주지 않을 경우 파이썬에서 해당 에러 메시지를 띄우게 됩니다.
마지막으로, POST
요청은 바디에 정보를 담아 요청하기 때문에 URL에서는 별도의 작업이 필요하지 않으며, 해당 뷰 클래스가 호출될 수 있도록만 설정되어 있으면 요청을 처리할 수 있습니다.
'Django' 카테고리의 다른 글
장고 get_or_create()와 race condition 문제 (0) | 2022.03.05 |
---|---|
장고 Q를 활용한 필터링, 정렬, 검색 방법 (0) | 2022.02.20 |
장고 ORM과 쿼리셋의 개념 (0) | 2022.02.07 |
장고, 파이썬 csv 파일 처리 방법 (0) | 2022.02.01 |
장고 프론트엔드와 통신 방법: HTTP POST, GET request 처리하기 (0) | 2022.01.28 |