Django REST framework(三): DRF的请

2020-07-12  本文已影响0人  是立品啊

请求模块的入口函数

上节分析到,DRF的请求生命周期的入口其实在APIViewdispatch()中,请求模块的函数入口也是在dispatch()

APIView的dispatch的self.initialize_request(request, *args, **kwargs)

源码分析

def initialize_request(self, request, *args, **kwargs):
    """
    Returns the initial request object.
    """
    parser_context = self.get_parser_context(request)

    return Request(
        request,
        parsers=self.get_parsers(),
        authenticators=self.get_authenticators(),
        negotiator=self.get_content_negotiator(),
        parser_context=parser_context
    )

Request类源码

class Request:
    """
    Wrapper allowing to enhance a standard `HttpRequest` instance.

    Kwargs:
        - request(HttpRequest). The original request instance.
        - parsers_classes(list/tuple). The parsers to use for parsing the
          request content.
        - authentication_classes(list/tuple). The authentications used to try
          authenticating the request's user.
    """

    def __init__(self, request, parsers=None, authenticators=None,
                 negotiator=None, parser_context=None):
        assert isinstance(request, HttpRequest), (
            'The `request` argument must be an instance of '
            '`django.http.HttpRequest`, not `{}.{}`.'
            .format(request.__class__.__module__, request.__class__.__name__)
        )
        self._request = request
        self.parsers = parsers or ()
        self.authenticators = authenticators or ()
        self.negotiator = negotiator or self._default_negotiator()
        self.parser_context = parser_context
        self._data = Empty
        self._files = Empty
        self._full_data = Empty
        self._content_type = Empty
        self._stream = Empty

        if self.parser_context is None:
            self.parser_context = {}
        self.parser_context['request'] = self
        self.parser_context['encoding'] = request.encoding or settings.DEFAULT_CHARSET

        force_user = getattr(request, '_force_auth_user', None)
        force_token = getattr(request, '_force_auth_token', None)
        if force_user is not None or force_token is not None:
            forced_auth = ForcedAuthentication(force_user, force_token)
            self.authenticators = (forced_auth,)


    def __getattr__(self, attr):
        """
        If an attribute does not exist on this instance, then we also attempt
        to proxy it to the underlying HttpRequest object.
        """
        try:
            return getattr(self._request, attr)
        except AttributeError:
            return self.__getattribute__(attr)

Requets对象的方法和属性

请求解析相关

.data

query_params

.parsers

内容协商相关

.accepted_renderer

.accepted_media_type

认证相关

.user

.auth

.authenticators

浏览器相关

.method

.content_type

.stream

总结

  1. drf对原生requets做了二次封装,request._request就是原生的requets
  2. 原生的request对象属性和方法都可以被drfrequest对象直接访问(兼容)
  3. drf请求的所有URL拼接参数都被解析到rquest.query_params中,所有数据包数据都被解析到rquest.data
  4. get无法提供数据包参数,但是post可以提供url拼接参数
上一篇 下一篇

猜你喜欢

热点阅读