首页 > 其他分享 >django中APIView里的dispatch和as_view方法分析

django中APIView里的dispatch和as_view方法分析

时间:2022-10-23 23:55:50浏览次数:81  
标签:APIView self request dispatch django response view

位置:

from rest_framework.views import APIView

继承APIView类视图形式的路由:

path('booksapiview/', views.BooksAPIView.as_view()),  #在这个地方应该写个函数内存地址

继承APIView类的视图函数:

from rest_framework.views import APIView

class BooksAPIView(APIView):
    def get(self):
        pass
    
    def post(self):
        pass

APIView源码分析:

继承了APIView的视图函数,最终执行的是APIView里的as_view方法

@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

    # 1.调用APIView父类,也就是View类中的as_view方法,将其返回值view在赋值给view
    view = super().as_view(**initkwargs)
    # 2.这里践行了一切皆对象的原则,将cls这个视图类给了view.cls,下面哪个也是一样
    view.cls = cls
    view.initkwargs = initkwargs

    # Note: session based authentication is explicitly CSRF validated,
    # all other authentication is CSRF exempt.
    # 3.这句话的意思就是以后所有继承APIView的试图函数都没有csrf认证了,和View类一样,APIview类的as_view方法最后也返回了view
    # 只不过apiview新增了去除csrf认证这里
    return csrf_exempt(view)

注意:上述返回的view内存地址,需要去找dispatch方法是先去apiview里找,而不是view类中的dispatch了

apiview里的dispatch方法分析:

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这个方法返回的新的由rest_framework中的Request类实例化产生的request对象
    request = self.initialize_request(request, *args, **kwargs)
    # 又把新的request对象给了视图函数中的request,从此,视图函数中的request就是新的request对象了
    self.request = request
    self.headers = self.default_response_headers  # deprecate?

    try:
        # 这里执行了apiview里的initial方法,这个方法里面包含了三大认证模块(重要)
        self.initial(request, *args, **kwargs)

        # Get the appropriate handler method
        # 三大认证过了之后,继续走,这里和view里面差不多,通过反射得到对应请求方式的函数地址
        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

        # 将get请求或者其他请求方式执行之后的结果在给response模块
        response = handler(request, *args, **kwargs)

    # 这里是三大认证出异常的异常模块
    except Exception as exc:
        response = self.handle_exception(exc)

    # 渲染模块,对response这个相应结果在进行包装(就是在前端看到的由rest_framework渲染出来的数据结果页面)
    self.response = self.finalize_response(request, response, *args, **kwargs)
    # 返回该渲染模块
    return self.response

def initial(self, request, *args, **kwargs):
    # 该方法最重要的就是下面三句代码
    # Ensure that the incoming request is permitted
    # 这个是认证组件
    self.perform_authentication(request)
    # 这个是权限组件
    self.check_permissions(request)
    # 这个是频率组件
    self.check_throttles(request)

标签:APIView,self,request,dispatch,django,response,view
From: https://www.cnblogs.com/suncolor/p/16820087.html

相关文章

  • dispatch(dispatched)
    英语单词distribute和dispatch意义上有什么区别?可以互换,distribute强调的是向众多的对象发送众多的东西,dispatch主要的对象是信件,包裹,电报等,另外只有dispatch可以用人做宾......
  • ubuntu+Django + nginx + uwsgi 部署
    ubuntu+Django+nginx+uwsgi部署0.前期准备注意:以下几件事都必须在激活虚拟环境下完成运行以下命令生成项目所需的依赖列表,会在项目根目录生成一个requirements.......
  • Django Admin save 重写 保存
    在djangoadmin管理控制台中,用户按下“Saveandaddanother”,表单的字段值仍然填充最后插入的值并且保存在ModelAdmin中添加选项save_as=True即可这将只对现有对象......
  • 1 django配置前的介绍
    一、django配置前的介绍1.创建虚拟环境2.下载django框架在pycharm页面按Alt+F12,弹出terminal终端窗口,在其中输入pipinstall-ihttps://pypi.douban.com/simple/dja......
  • GenericAPIView
    https://www.bilibili.com/video/BV1z5411D7BQ?p=14&vd_source=caabcbd2a759a67e2a3de8acbaaf08ea views.pyfromsers.modelsimportBookfromrest_frameworkimpor......
  • Django入门到入土
    Django-前期初识Django-入门Django-静态文件配置,链接数据库,request对象方法解决django.core.exceptions.ImproperlyConfigured:RequestedsettingLOGGING_CONFIG,but......
  • Django-ORM常用字段及参数
     目录-常用字段--内容--自定义字段-字段参数--普通---null---unique---db_index---default--DateField和DateTimeField---auto_now_add---auto_now--关系......
  • Django-静态文件配置,链接数据库,request对象方法
    目录-静态文件配置--含义--配置方法--动态解析---含义---实现---示例-pycharm链接MySQL-Django链接MySQL--代码配置--代码声明-request对象常用方法--示例......
  • 解决django.core.exceptions.ImproperlyConfigured: Requested setting LOGGING_CONFI
    在开发Django项目时,调整了django文件目录结构同时配置完自己的配置文件路径后在终端执行pythonmanage.pyrunserver命令启动django项目时,报以下错误:django.core.ex......
  • Django-ORM
    目录-定义-使用方法--models.py--数据库迁移命令 --注意-实际操作--ORM实现字段的增删改查--ORM实现数据的增删改查--ORM创建表与表之间的联系-定义ORM:对......