이전글
request, response data flow
views.py에 python client를 통해서 api에 request를 할 때, api의 응답에 대해서 어떤 움직임이 일어나는지 자세히 보고자 합니다. request.body 부분이 코드에 추가되었습니다
# views.py
from django.http import JsonResponse
# Create your views here.
def api_home(request, *args, **kwargs):
# 데이터 흐름
# request -> HttpRequest -> Django
body = request.body # byte string of JSON data
print(body)
return JsonResponse({"message":"하이, 이건 장고 api json 응답"})
basic.py 폴더의 requests.get 부분에 params 부분이 추가되었습니다
# basic.py
import requests
# api url 설정한 곳으로 변경
endpoint = "http://127.0.0.1:8000/api/"
response = requests.get(endpoint, params={"abc":123} ,json={"query":"Hello world"})
print(response.status_code)
print(response.json())
Django 서버를 manage.py를 통해 띄운 상태에서 어떤 변화가 있는지 살펴봅니다
python3 manage.py runserver 8000
# py_client 폴더로 이동후
python3 basic.py
여기에서 헷갈릴 수 있는 부분을 짚고 넘어가자면, 장고로 runserver 하는 곳은 서버 역할을 하고 있고, python으로 basic.py를 실행하는 것은 요청하는 사용자의 역할을 하고 있습니다.
따라서 두가지의 로그 형태가 다르게 나오게 되는데요
request에 담은 json은 views.py에 api_home 함수에 설정한 print를 통해서, runserver를 진행한 터미널에 해당 응답이 뜰 것이며, 서버가 response한 내용은 basic.py를 실행한 터미널에 로그가 남을 겁니다
request가 가진 정보 확인
request는 우리가 basic.py에 입력한 정보 외에도 다른 정보를 담고 있습니다. 일례로 header와, content_type에 대한 정보를 서버측에 출력되게끔 설정해서 확인 해보겠습니다. views.py를 다음과 같이 수정하고, basic.py를 실행해서 서버측에 어떤 정보가 print 되는지 확인 해봅니다
# views.py
import json
from django.http import JsonResponse
# Create your views here.
def api_home(request, *args, **kwargs):
# 데이터 흐름
# request -> HttpRequest -> Django
body = request.body # byte string of JSON data
data = {}
data = json.loads(body) #json to dict
print(data)
print(request.headers) # request의 header 정보
print(request.content_type) # request의 content_type
return JsonResponse({"message":"하이, 이건 장고 api json 응답"})
python3 basic.py
대부분의 정보가 header 부분에 포함되어 있는 것을 알 수 있습니다
JSON 사용 시 발생 할 수 있는 에러
JSON으로 응답을 하고 있으므로, request가 들어온 header 정보를 다시 response를 한다고 가정해보겠습니다
request의 정보를 다시 dictionary에 담아 return을 설정하고, basic.py를 통해 서버에 request 합니다
import json
from django.http import JsonResponse
# Create your views here.
def api_home(request, *args, **kwargs):
# 데이터 흐름
# request -> HttpRequest -> Django
body = request.body # byte string of JSON data
data = {}
data = json.loads(body) #json to dict
data['headers'] = request.headers
data['content_type'] = request.content_type
return JsonResponse(data)
디코딩 과정에서 에러가 발생하는데, 파이썬의 dictionary 형태가 정확히 지켜지지 않았기 때문에 오류가 발생합니다
request.header 부분에서 해당 에러가 발생하는데, 이를 dict()로 감싸줍니다
import json
from django.http import JsonResponse
# Create your views here.
def api_home(request, *args, **kwargs):
# 데이터 흐름
# request -> HttpRequest -> Django
body = request.body # byte string of JSON data
data = {}
data = json.loads(body) #json to dict
data['headers'] = dict(request.headers)
data['content_type'] = request.content_type
return JsonResponse(data)
JSONResponse에는 dictionary 형태가 지켜져야 함을 확인할 수 있으며, 이를 알고 예외 처리를 할 수 있어야 합니다
request의 parameter 확인하기
basic.py에 get 메서드에 params를 추가했던 것을 기억하시나요? 추가했음에도 불구하고, 서버 로그나 응답에도 표시가 되지 않고 있었습니다. 이러한 내용을 서버측에서 확인할 수 있는데요
request.GET, request.POST를 추가하고, print 합니다
# views.py
import json
from django.http import JsonResponse
# Create your views here.
def api_home(request, *args, **kwargs):
# 데이터 흐름
# request -> HttpRequest -> Django
# 추가된 코드
print(request.GET)
print(request.POST)
body = request.body # byte string of JSON data
data = {}
data = json.loads(body) #json to dict
data['headers'] = dict(request.headers)
data['content_type'] = request.content_type
return JsonResponse(data)
basic.py를 실행하면
python3 basic.py
첫번째 칸 request.GET 부분에서 쿼리가 들어오는 것을 볼 수 있습니다
두번째 칸에는 request.POST 부분으로, POST가 아니기 때문에 빈 딕셔너리 형태가 존재합니다
위 방법들을 통해서 사용자로서 요청을 서버에 테스트 해볼 수 있습니다
'23년 이전 글 > Django' 카테고리의 다른 글
Django Rest Framework3 - Django 프로젝트 실행 (0) | 2022.08.15 |
---|---|
Django Rest Framework2 파이썬 API Client 만들기 (0) | 2022.08.15 |
Django Rest Framework 기본 환경 설정 (0) | 2022.08.15 |