rest-framework之APIView

rest-framework之APIView

一 安装djangorestframework

方式一:pip3 install djangorestframework

方式二:pycharm图形化界面安装

方式三:pycharm命令行下安装(装在当前工程所用的解释器下)

二 djangorestframework的APIView分析

复制代码

 @classmethod
  def as_view(cls, **initkwargs):
      """
      Store the original class on the view function.
​
      This allows us to discover information about the view when we do URL
      reverse lookups. Used for breadcrumb generation.
      """
      if isinstance(getattr(cls, 'queryset', None), models.query.QuerySet):
          def force_evaluation():
              raise RuntimeError(
                  'Do not evaluate the `.queryset` attribute directly, '
                  'as the result will be cached and reused between requests. '
                  'Use `.all()` or call `.get_queryset()` instead.'
              )
          cls.queryset._fetch_all = force_evaluation
​
      view = super(APIView, cls).as_view(**initkwargs)
      view.cls = cls
      view.initkwargs = initkwargs
​
      # Note: session based authentication is explicitly CSRF validated,
      # all other authentication is CSRF exempt.
      return csrf_exempt(view)

复制代码

复制代码

 def dispatch(self, request, *args, **kwargs):
      """
      `.dispatch()` is pretty much the same as Django's regular dispatch,
      but with extra hooks for startup, finalize, and exception handling.
      """
      self.args = args
      self.kwargs = kwargs
      request = self.initialize_request(request, *args, **kwargs)
      self.request = request
      self.headers = self.default_response_headers # deprecate?
​
      try:
          self.initial(request, *args, **kwargs)
​
          # Get the appropriate handler method
          if request.method.lower() in self.http_method_names:
              handler = getattr(self, request.method.lower(),
                                self.http_method_not_allowed)
          else:
              handler = self.http_method_not_allowed
​
          response = handler(request, *args, **kwargs)
​
      except Exception as exc:
          response = self.handle_exception(exc)
​
      self.response = self.finalize_response(request, response, *args, **kwargs)
      return self.response

复制代码

复制代码

    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
      )

复制代码

复制代码

    def initial(self, request, *args, **kwargs):
      """
      Runs anything that needs to occur prior to calling the method handler.
      """
      self.format_kwarg = self.get_format_suffix(**kwargs)
​
      # Perform content negotiation and store the accepted info on the request
      neg = self.perform_content_negotiation(request)
      request.accepted_renderer, request.accepted_media_type = neg
​
      # Determine the API version, if versioning is in use.
      version, scheme = self.determine_version(request, *args, **kwargs)
      request.version, request.versioning_scheme = version, scheme
​
      # Ensure that the incoming request is permitted
      self.perform_authentication(request)
      self.check_permissions(request)
      self.check_throttles(request)

复制代码

三 djangorestframework的Request对象简单介绍

img

 

posted @ 2022-01-19 20:17  mjth  阅读(72)  评论(0)    收藏  举报