【Django学习笔记 - 9】:装饰器在类视图中的使用、中间件(开发中间件)、知识点小补充(子应用的集中管理)

本文涉及的产品
Serverless 应用引擎免费试用套餐包,4320000 CU,有效期3个月
性能测试 PTS,5000VUM额度
云原生网关 MSE Higress,422元/月
简介: 【Django学习笔记 - 9】:装饰器在类视图中的使用、中间件(开发中间件)、知识点小补充(子应用的集中管理)

一、类试图装饰器


1、装饰器的作用


   装饰器实质上就是一个函数,其可以让其他函数在不去改变任何代码的前提下增加额外的功能,装饰器的返回值是一个函数对象。  


   类视图使用装饰器


   为类视图添加装饰器,可以使用两种方法。


   为了理解方便,先定义一个为视图函数准备的装饰器(在设计装饰器时基本都以函数视图作为考虑的被装饰对象),以及一个要被装饰的类视图。  




2、基本使用


案例一:为类试图中所有的视图方法都使用装饰器


需要在views.py中导入的模块 :

from django.utils.decorators import method_decorator
from django.views import View
from django.http import HttpResponse


views.py

from django.utils.decorators import method_decorator
from django.views import View
from django.http import HttpResponse
def Game(func):
    print('今天去玩游戏')
    def wrapper(request):   # 内部函数第一个参数同样也是一个Httprequest对象
        print({'游戏一': '王者', '游戏二': '吃鸡'})
        print('请求路径:%s' %request.path)
        return func(request)
    return wrapper
'''类试图使用装饰器'''
# 在method_decorator中,name参数的作用:限制装饰器所使用的范围
@method_decorator(Game, name='dispatch') # 当name参数的值为dispatch的时候表示为当前类试图中所有的视图方法都使用装饰器
class Things(View):
    # 为类中多个视图添加装饰器
    def get(self, request):
        print('打篮球')
        return HttpResponse('篮球')
    def post(self, request):
        print('打排球')
        return HttpResponse('排球')
    def put(self, request):
        print('打羽毛球')
        return HttpResponse('羽毛球')



子路由文件:urls.py

from django.urls import path
from app_1 import views
urlpatterns = [
    path('Happy', views.Things.as_view())
]



运行时使用Postman发送对应的请求:

  • 发送get请求


5b87613f17a8455b9eba61971ec85f73.png


运行结果:

32407589e26d4e018483e14d6e7325e1.png

发送post请求

38adb4bca84d45929d23360d38768213.png


049617affdb842098c1bf5210307559c.png

发送put请求

31b4283483ed443b9666b54e42e447f1.png


42cba1d203d3418b97c935786aa7946d.png



案例二:给类视图中单个视图函数使用装饰器


比如给类试图中的get函数使用装饰器,只需要将name='dispatch' 改为 name='get' 即可。其他的请求比如post请求,put请求不能使用装饰器


e8a1dd061aa345d89a2624192c3eea28.png


发送get请求

f024a582e25740cd8c168e31f26621ff.png


7f2883a115dd41fbb87263f33af08450.png

发送post请求

57ad06f62c2542ffad926573c667912d.png

bb844db97b2c458bb1c5f14c69096dd8.png


案例三:给类视图中多个视图函数使用装饰器

e7c8c6b59cb3462cba946aa74e046d4a.png

发送get请求

c42d3f7ae5bb41a2bb9162c9c72e83de.png

发送post请求

6fba3b7202e246efb04c8b1b4d800fb4.png

发送put请求

7c5a85f6d47140429f10e9a102828fa7.png


总结

导入的关键模块:method_decorator

from django.utils.decorators import method_decorator


装饰器装饰类中的所有方法

@method_decorator(装饰器, name=' ')

name的值 -> 'dispatch', 'get', 'post', 'put', 'delete', 'options'等


注意:name的值一定是一个字符串类型,而不是一个列表或者元组或集合等。  





二、中间件的基本了解


1、Django中的中间件


Django中的中间件是一个轻量级、底层的插件系统,可以介入Django的请求和响应处理过程,修改Django的输入或输出。中间件的设计为开发者提供了一种无侵入式的开发方式,增强了Django框架的健壮性。我们可以使用中间件,在Django处理视图的不同阶段对输入或输出进行干预。  




2、中间件的作用


传话人,中间商。能够介入请求与响应的流程之间,可以对请求对象或者响应对象进行修改,修改了之后在传到下一个流程之中进程处理;


同时中间件也可以提升项目的一个安全性。


中间件的作用范围是整个请求响应的流程。



3、内置中间件的简介

b6890cb6969c48cc9ae5c4e8f454aca0.png


   用于安全证书验证:


'django.middleware.security.SecurityMiddleware'


   session验证:


'django.contrib.sessions.middleware.SessionMiddleware'


   通用中间件,核验请求的地址是否符合标准的请求格式:


'django.middleware.common.CommonMiddleware'

   Csrf,用于防御跨站请求伪造攻击,当有表单数据的提交时,必须添加csrf_token,否则访问会被拒绝


'django.middleware.csrf.CsrfViewMiddleware'

   用于验证用户登录,需要以来session中间件,也就是说session验证的中间件需要出现在此中间件之前


'django.contrib.auth.middleware.AuthenticationMiddleware'

   消息处理中间件


'django.contrib.messages.middleware.MessageMiddleware'

   欺骗点击防御,页面中可能嵌套了另一个页面,表面上点击响应的内容与实际点击响应的内容不一样


'django.middleware.clickjacking.XFrameOptionsMiddleware'




三、开发中间件


1、中间件的定义方法


  • 定义一个中间件工厂函数,然后返回一个可以被调用的中间件。
  • 中间件工厂函数需要接收一个可以调用的get_response对象。
  • 返回的中间件也是一个可以被调用的对象,并且像视图一样需要接受一个request对象参数,返回一个response对象。




2、使用操作

案例一:使用一个中间件


在根目录中创建一个中间件目录,然后在其中创建一个py文件,即中间件文件

d307141eb33247f18e5514465654f45f.png

def outter(get_response): # get_response
    # 此处的代码在项目加载的时候就已经启动并执行
    print('第一个中间件')
    def inner(request): # request表示请求对象
        print('1')  # 此处的代码是在视图处理之前执行
        response = get_response(request)    # get_response 直接视作一个视图
        print('2')  # 此处代码是在视图处理之后执行
        return response
    return inner

在views.py中添加一个视图函数

def text(request):
    print('Hello Middleware')
    return HttpResponse('Middleware')


注册中间件

52361804f84d428f91cbf15db50e695e.png


如果outter在中间件列表中并不是最后一个元素,即最后一个中间件的话,那么response就是下一个中间件。

如果outter在中间件列表中是最后一个元素,那么response就是一个视图。


运行:

6580fb9052a9439f93801072a321a800.png

2d552280146f416584c85bae81dc046b.png


案例一:使用多个中间件

先创建几个中间件文件,在里面写入函数


13495e70b2dd4f58ad536e75f95d4484.png

b572304e59c648c59aa3748fdeb5f423.png


注册中间件

38183a46b35a40c1bac5e991fb0d5fc8.png


运行:

项目加载时


de77ad782a7e4f989511f27339e16f34.png


访问路径后

d07df667d7f44a8098743778eadb7721.png

35095dcd7067494f81050acaaf25ad86.png


从以上结果可看到,项目加载时是从下往上,请求试图被处理前前中间件从上至下执行,请求试图被处理后,中间件从下至上执行




3、中间件的开发流程


中间件开发流程:
1.在项目中创建一个用于存放中间件代码的文件夹

2.在此文件夹中进行中间件的设计


3.中间设计好了之后,需要将自定义的中间件注册到项目之中





四、 知识点小补充(子应用的集中管理



子应用的集中管理:

如果编辑器版本用的是21以下,需要在配置文件中添加上如下代码

import sys


sys.path.insert(0,os. path.join(BASE_DIR,'apps ' ))

如果编辑器变笨用的是21的同学,虽然不用添加上方代码,但需要将apps文件夹设置成根目录(source root)  







相关文章
|
2月前
|
中间件 API 开发者
深入理解Python Web框架:中间件的工作原理与应用策略
在Python Web开发中,中间件位于请求处理的关键位置,提供强大的扩展能力。本文通过问答形式,探讨中间件的工作原理、应用场景及实践策略,并以Flask和Django为例展示具体实现。中间件可以在请求到达视图前或响应返回后执行代码,实现日志记录、权限验证等功能。Flask通过装饰器模拟中间件行为,而Django则提供官方中间件系统,允许在不同阶段扩展功能。合理制定中间件策略能显著提升应用的灵活性和可扩展性。
40 4
|
3月前
|
JSON 前端开发 API
Django 后端架构开发:通用表单视图、组件对接、验证机制和组件开发
Django 后端架构开发:通用表单视图、组件对接、验证机制和组件开发
63 2
|
3月前
|
JSON 数据处理 API
Django后端架构开发:视图与模板的正确使用
Django后端架构开发:视图与模板的正确使用
30 1
|
2月前
|
数据处理 Python
Django视图:构建动态Web页面的核心技术
Django视图:构建动态Web页面的核心技术
|
3月前
|
C++ Python
Django视图函数VS类视图:如何选择最适合你的开发方式?
【8月更文挑战第31天】本文对比了Django中的函数视图和类视图。函数视图直接处理HTTP请求和响应,灵活且易于维护,适用于简单业务逻辑;类视图基于Python类,提供更丰富的功能和更高的灵活性,适合处理复杂业务逻辑。选择哪种视图取决于具体需求,合理使用两者可帮助你构建高效且易维护的Django应用。
58 0
|
3月前
|
中间件 数据库连接 UED
Django中间件秘籍:如何用几行代码让你的应用变得超级强大?
【8月更文挑战第31天】中间件是Django框架的核心特性,位于视图与HTTP服务器之间,允许全局处理请求和响应,增强Web应用功能。通过实现`MiddlewareMixin`类的方法,如`process_request`和`process_response`,可以轻松实现请求预处理或响应后处理。中间件应用场景广泛,包括用户认证、CSRF防护和数据库连接管理等。创建并配置中间件需将其加入`settings.py`的`MIDDLEWARE`列表,顺序决定执行优先级。合理利用中间件能提高代码重用性和应用性能,带来更好的用户体验。
52 0
|
3月前
|
安全 API Python
Django 如何使用视图动态输出 CSV 以及 PDF
Django 如何使用视图动态输出 CSV 以及 PDF
47 4
|
3月前
|
Linux Shell 数据库
python Django教程 之 安装、基本命令、视图与网站
python Django教程 之 安装、基本命令、视图与网站
|
4月前
|
API 数据库 数据安全/隐私保护
Django配置api、管理系统和视图
Django配置api、管理系统和视图
115 1
|
3月前
|
测试技术 Shell 数据库
Django视图测试:构建可靠Web应用的关键步骤
Django视图测试:构建可靠Web应用的关键步骤
29 0