• Django知识


    目录

    一.request对象方法

    1.request.method

    2.request.POST

    3.request.GET

    4.request.FILES

    5.request.path

    二.FBV与CBV引入

    1.FBV

    2.CBV

    (1)路由

    (2)视图

    3.详解

    (1)FBV

    (2)CBV

    (3)小结

    三.CBV源码剖析

    1.as_view方法

    (1)路由对应函数内存地址

    (2)view方法剖析

    (3)小结


    一.request对象方法

    1.request.method

    该方法返回客户端用于发起请求的HTTP方法,例如可以是'GET','POST','PUT','DELETE'等,可以使用该方法来确定请求的类型,并相应的执行特定操作

    2.request.POST

    该属性是一个类似字典的对象,包含了请求中通过POST方法发送的所有参数,这些参数通常是通过HTML表单发送的,可以使用参数的名字作为键来访问单个参数

    3.request.GET

    类似于request.POST,该属性包含了请求中通过GET方法发送的所有参数,这些参数通常会附加在URL之后,以问号分隔,可以使用参数的名字作为键来访问单个参数

    4.request.FILES

    该属性是一个类似字典的对象,包含了请求中通过文件上传组件发送的所有文件,当表单中包含文件上传字段时,通过request.FILES可以访问上传的文件,可以使用文件的名字作为键来访问单个文件

    5.request.path

    只能获取到路由地址,无法获取到参数

    二.FBV与CBV引入

    视图函数既可以是函数也可以是类

    1.FBV

    1. def index(request):
    2. return HttpResponse('index')

    2.CBV

    (1)路由

    1. # CBV路由 根据请求方式的不同选择不同的入口动作
    2. url('^login/',views.MyLogin.as_view())

    (2)视图

    1. from django.views import View
    2. class MyLogin(View):
    3. def get(self,request,*args,**kwargs):
    4. return HttpResponse("get")
    5. def post(self,request,*args,**kwargs):
    6. return HttpResponse("post")

    3.详解

    FBV(Function-Based Views)与 CBV(Class-Based Views)是 Django 框架中用于处理视图(Views)的两种不同的编程方式。

    (1)FBV

    • FBV是Django最早支持的一种视图编程方式
    • 使用函数作为视图的处理逻辑,函数参数通常是request对象,表示用户发送的HTTP请求
    • 函数内部可以根据请求方法、参数、数据等进行相应的处理,并返回HttpResponse对象作为响应
    1. from django.http import HttpResponse
    2. def my_view(request):
    3. # 处理逻辑
    4. if request.method == 'GET':
    5. # 处理 GET 请求
    6. return HttpResponse('Hello, GET Request!')
    7. elif request.method == 'POST':
    8. # 处理 POST 请求
    9. return HttpResponse('Hello, POST Request!')

    (2)CBV

    • CBV是Django提供的另一种视图编程方式,引入了面向对象的概念
    • 使用类来表示视图,并使用类中的方法来处理不同类型的HTTP请求
    • Django提供了许多内置的CBV类,可以方便的扩展和重写这些类来实现自定义功能
    1. from django.http import HttpResponse
    2. from django.views import View
    3. class MyView(View):
    4. def get(self, request):
    5. # 处理 GET 请求
    6. return HttpResponse('Hello, GET Request!')
    7. def post(self, request):
    8. # 处理 POST 请求
    9. return HttpResponse('Hello, POST Request!')

    (3)小结

    • 选择FBV还是CBV取决于具体的需求和个人偏好
    • FBV相对简单直观,适合编写简单的视图逻辑
    • CBV可以通过继承和重写类来实现代码复用和可扩展性,适用于复杂的视图处理场景
    • 在实际开发中,可以根据需求选择适合的方式来编写视图处理函数或类

    三.CBV源码剖析

    1.as_view方法

    (1)路由对应函数内存地址

    url(r'^login/', views.MyLogin.as_view()),

    方法/函数名 加 括号 执行优先级最高

    • 可能的原因
      • 要么是被@staicmethod方法修饰的静态方法
      • 要么是被@classmethod方法修饰的类方法
    • 查看源代码
      • 绑定给类的静态方法,将类作为第一个参数传进去
    1. @classonlymethod
    2. def as_view(cls, **initkwargs):
    3. """
    4. Main entry point for a request-response process.
    5. """
    6. for key in initkwargs:
    7. if key in cls.http_method_names:
    8. raise TypeError("You tried to pass in the %s method name as a "
    9. "keyword argument to %s(). Don't do that."
    10. % (key, cls.__name__))
    11. if not hasattr(cls, key):
    12. raise TypeError("%s() received an invalid keyword %r. as_view "
    13. "only accepts arguments that are already "
    14. "attributes of the class." % (cls.__name__, key))
    15. def view(request, *args, **kwargs):
    16. self = cls(**initkwargs)
    17. if hasattr(self, 'get') and not hasattr(self, 'head'):
    18. self.head = self.get
    19. self.request = request
    20. self.args = args
    21. self.kwargs = kwargs
    22. return self.dispatch(request, *args, **kwargs)
    23. view.view_class = cls
    24. view.view_initkwargs = initkwargs
    25. # take name and docstring from class
    26. update_wrapper(view, cls, updated=())
    27. # and possible attributes set by decorators
    28. # like csrf_exempt from dispatch
    29. update_wrapper(view, cls.dispatch, assigned=())
    30. return view
    • view这是一个闭包函数
      • 返回值是这个闭包函数的内存地址
    • 在启动Django项目时,就会立即执行as_view方法
    url(r'^login/',views.view()),
    • 方法类似FBV方法

    总结:CBV和FBV在路由匹配本质上是一样的,都是路由对应函数内存地址

    (2)view方法剖析

    1. def view(request, *args, **kwargs):
    2. # 参数 cls 就是我们自己写的类
    3. self = cls(**initkwargs)
    4. # 等价于 self = MyLogin(**initkwargs) ---- 产生一个我们自己写的类的对象
    5. if hasattr(self, 'get') and not hasattr(self, 'head'):
    6. self.head = self.get
    7. # 给我们的对象赋值属性
    8. self.request = request
    9. self.args = args
    10. self.kwargs = kwargs
    11. '''
    12. 在看python源码的时候,一定要时刻注意面向对象属性方法查找顺序
    13. 先从对象自己找
    14. 再去产生对象的类里面找
    15. 之后再去父类找
    16. 总结:在看源码时,如果遇到 self.x 操作时,一定要时刻注意当前这个self到底是谁
    17. '''
    18. return self.dispatch(request, *args, **kwargs)
    1. http_method_names = ['get', 'post', 'put', 'patch', 'delete', 'head', 'options', 'trace']
    2. # CBV 的 精髓 !!!
    3. def dispatch(self, request, *args, **kwargs):
    4. # Try to dispatch to the right method; if a method doesn't exist,
    5. # defer to the error handler. Also defer to the error handler if the
    6. # request method isn't on the approved list.
    7. # 获取当前请求的小写格式 然后比对当前请求方式是否合法
    8. # 以 get 请求为例
    9. if request.method.lower() in self.http_method_names:
    10. '''
    11. 反射:通过字符串来操作对象的属性或方法
    12. '''
    13. # self 是我们自己写的类产生的对象
    14. # handler = getattr(自己写的类产生的对象,'get',当找不到get属性或方法时就会用到第三个参数)
    15. # 因为我们在自己的类里面重写了 get 方法 ,所以这里的 handler 就变成了我们自己写的 get方法
    16. # handler = 我们自己写的类里面的get方法
    17. handler = getattr(self, request.method.lower(), self.http_method_not_allowed)
    18. else:
    19. handler = self.http_method_not_allowed
    20. # 自动调用 get 方法
    21. return handler(request, *args, **kwargs)

    (3)小结

    url(r'^login/', views.MyLogin.as_view()),
    • 当我们启动Django项目时
    • 会自动触发路由中的方法,调用 as_view 方法并自执行
    • 在执行后我们查看 as_view 方法的源码 发现
      • 在依次给我们的对象赋值后,最终返回了一个自执行的 dispatch 方法
    • 于是我们又去查看了 dispatch 方法
      • 在 dispatch 内部 ,先是将请求方式转换并进行校验
      • 然后开始校验需要调用的方法的调用位置,校验成功并拿到需要执行的方法执行
    • 在自己写的类中如果有相关的方法,会首先调用我们重写的类方法,并返回执行结果
      • 如果自己的类里面没有该方法 会去自己的父类中调用 父类的方法
        • 如果父类 以及 基类 都找不到则报错,抛出异常
  • 相关阅读:
    分类预测 | Matlab实现SO-RF蛇群算法优化随机森林多输入分类预测
    【MySQL数据库】最全安装过程及配置详解
    优化Scrum敏捷需求管理流程,敏捷需求如何管理。
    sudo漏洞
    C++ STL标准模板库(一)
    智能BI平台(后端)-- 项目介绍
    [最短路径问题]Dijkstra算法(含还原具体路径)
    二 linux操作系统安装git并与gitlab通过SSH方式互通
    第七章 数学 AcWing 1533. 1 的个数
    SpringMVC01(入门)
  • 原文地址:https://blog.csdn.net/qq_65852978/article/details/134398756