drf request 정리
Request 객체
DRF는 HttpRequest를 Request 객체로 확장하여 더 유연한 요청 파싱을 제공한다. 핵심 기능은 requst.POST와 비슷하지만 웹 API에 더 유용한 request.data 속성이다. JSON data를 파싱하는데 사용되는 것이므로 중요하다.
class ExampleView(APIView):
"""
A view that can accept POST requests with JSON content.
"""
parser_classes = [JSONParser]
def post(self, request, format=None):
return Response({'received data': request.data})
request.data는 parsing된 request의 body의 content부분을 반환해준다.
body안에는 여러 데이터가 json 형태로 들어있다. 그래서 이 dict안의 값을 .data로 파싱해서 반환해주는 것이다.
request.POST # form 데이터를 처리, post 메서드에서만 사용
request.data # 임의의 데이터를 처리(json 형식), post와 patch, put 에서 사용
* 참고로 request.files라는 것도 있는데, 이건 이미지 파일을 반환해주는 메소드이다.
request.method
http 메서드를 대문자로 반환해준다 ex) POST
content_type='applictaion/json' 과 같은 컨텐츠 타입을 알려주는 메서드이다. 만약, 이미지를 포함한 객체를 반환받는다면, 'multipart/form-data'를 반환받을 것이다.
Auth
DRF는 인증정책과 관련해서 많은 기능을 제공한다.
request.user
Django에서 지원하는 session 방식의 로그인 / rest_framework에서 지원하는 JWT 등 로그인을 하면 request.user의 정보를 가져올 수 있다.
1번 일반 로그인 방식은 먼저 cookie에 있는 세션값을 request.session에 저장하고 session 값을 통해 유저 정보를 찾습니다.
2번 JWT 방식은 header의 token값을 통해 유저 정보를 찾습니다.
* JWT를 이용하면 cookie값에 session데이터가 없기 때문에 알 수 없는 유저(로그인하지 않은 유저)로 판단하고 request.user에 AnonymousUser 값이 들어갑니다.
이와 헷갈리는 것이 있었다. 바로 self.get_object()이다.
class SingleObjectMixin(ContextMixin):
"""
Provide the ability to retrieve a single object for further manipulation.
"""
model = None
queryset = None
slug_field = 'slug'
context_object_name = None
slug_url_kwarg = 'slug'
pk_url_kwarg = 'pk'
query_pk_and_slug = False
def get_object(self, queryset=None):
"""
Return the object the view is displaying.
Require `self.queryset` and a `pk` or `slug` argument in the URLconf.
Subclasses can override this to return any object.
"""
# Use a custom queryset if provided; this is required for subclasses
# like DateDetailView
if queryset is None:
queryset = self.get_queryset()
# Next, try looking up by primary key.
pk = self.kwargs.get(self.pk_url_kwarg)
slug = self.kwargs.get(self.slug_url_kwarg)
if pk is not None:
queryset = queryset.filter(pk=pk)
# Next, try looking up by slug.
if slug is not None and (pk is None or self.query_pk_and_slug):
slug_field = self.get_slug_field()
queryset = queryset.filter(**{slug_field: slug})
# If none of those are defined, it's an error.
if pk is None and slug is None:
raise AttributeError(
"Generic detail view %s must be called with either an object "
"pk or a slug in the URLconf." % self.__class__.__name__
)
try:
# Get the single item from the filtered queryset
obj = queryset.get()
except queryset.model.DoesNotExist:
raise Http404(_("No %(verbose_name)s found matching the query") %
{'verbose_name': queryset.model._meta.verbose_name})
return obj
1. 전체 쿼리셋을 가져옵니다.
2. pk , 입력된 primary key를 가져옵니다.
3. 해당 pk를 통해 queryset 를 필터링합니다.
4. 필터링된 queryset에서 단일 객체를 리턴합니다.
때문에 self.get_object() == self.request.user 처럼 비교해서 사용할 수 있게 된다.
request.auth
session이나 jwt 값을 가져온다.
-----
참고
1. Django request 구조 파악하기
views.py 코드 일부분 class BlogView(APIView): permission_classes = (permissions.IsAuthenticated,) def post(self, request): print("request",request) print("request.data: ",request.data) print("requ..
vixxcode.tistory.com
JWT에서 Django request.user 까지의 여정
Django에서 request의 유저를 알기 위해선 request.user를 통해 알 수 있다. Django에서 지원하는 session 방식의 로그인 / rest_framework에서 지원하는 JWT 등 로그인을 하면 request.user의 정보를 가져올 수..
uiandwe.tistory.com
[Django]Django REST Framework 튜토리얼 2 (Requests and Responses)
이번 포스팅에서는 DRF의 Requests and Responses 공식 문서를 공부하면서 번역해보려고 한다. 해석에 틀린 내용이 있을 수 있으니 이해가 안가는 부분은 아래의 공식문서를 참조하기 바란다. DRF Requests
leffept.tistory.com