django中APIView里的dispatch和as_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)

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:django中APIView里的dispatch和as_view方法分析 - Python技术站

(0)
上一篇 2023年4月2日 下午4:39
下一篇 2023年4月2日 下午4:39

相关文章

  • xadmin的使用

    安装 在项目的虚拟环境下执行 pip install https://codeload.github.com/sshwsfc/xadmin/zip/django2 注意:xadmin对于不同django版本有不同的版本,一定要使用相对应的版本 在app中注册 INSTALLED_APPS = [ # … # xadmin主体模块 ‘xadmin’, # …

    Python开发 2023年4月2日
    00
  • 基本数据类型之列表

    1.列表的定义 1.采用变量名=[]的方式定义2.采用变量名=list()的方式定义 2.列表的作用 列表是用来存多个数据,并且这些数据是需要按位置存放的,后面我们可以通过索引取出列表里的数据。 3.类型转换 但凡可以被for循环遍历的类型(可迭代对象)都可以当做参数传给list()转成列表 4.列表的内置方法 # 1.按照索引取改值(正向取改+反向取改) …

    Python开发 2023年4月2日
    00
  • while循环语法

    while循环 循环的基本语法和使用 count = 0 # 定义一个初始条件 while 条件: 代码1 代码2 … count += 1 # 额,每循环一次+1,用来结束循环 退出循环的两种方式 方式一:将while后面的条件改成false,退出循环!该方式就是基本语法的使用方式!注意:改成false提交后面的代码还会执行,直到第二次判断开始结束循环…

    Python开发 2023年4月2日
    00
  • django中操作mysql数据库

    1.准备工作(django连接数据库) 1.本机电脑下载好mysql数据库2.打开django,修改setting.py中的DATABASES配置项 DATABASES = { ‘default’: { ‘ENGINE’: ‘django.db.backends.mysql’, ‘NAME’: ‘python’, ‘USER’: ‘root’, ‘PASSW…

    2023年4月2日
    00
  • flask基础介绍和语法

    flask基础介绍和语法 flask项目初始化的app.py介绍 # 从flask包中导入flask类 from flask import Flask # 使用flask类实例化出一个app对象 # __name__:代表当前app.py这个模块 app = Flask(__name__) # 创建一个路由和视图的映射 @app.route(‘/’) def…

    2023年4月2日
    00
  • 后台response和异常处理封装

    我们自己封装的一些东西,往往放在一个utils文件夹内,以后也方便管理和导入 后台response封装 # 自己封装的Response对象 from rest_framework.response import Response class APIResponse(Response): def __init__(self,code=1,msg=’成功’,re…

    2023年4月2日
    00
  • bbs项目前期准备和表设计

    一、前期准备 1.新建一个django项目 2.连接mysql数据库(注意需要在init文件里面书写import pymysql),告诉django使用pymysql连接数据库 3.静态文件路径在settings里配置一下,并且在项目文件夹下新建一个静态文件夹 4.将需要用到bootstrap的css和js文件添加到static文件夹内 二、bbs项目表设计…

    Python开发 2023年4月2日
    00
  • 实时展示用户上传的头像

    实时展示用户上传的头像 总体思路 “”” 1.首先需要给对应的上传头像input框绑定一个文本域变化事件 (当检测到用户对该文件框上传了头像就会触发一系列操作) 2.再生成一个文件阅读器对象 3.再获取用户上传的文件头像 4.把用户上传的文件头像交给文件阅读器对象FileReader读取 5.利用文件阅读器把读取的文件头像结果展示到前端页面 (修改img的s…

    Python开发 2023年4月2日
    00
合作推广
合作推广
分享本页
返回顶部