Python/django

drf request 정리

알면 알 수록 재밌다! 2022. 5. 10. 12:02

 

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