Django中间件

CBV添加装饰器

需要特殊装饰模块的帮助

[En]

Need the help of a special decorator module

from django.utils.decorators import method_decorator

方式1

直接添加到类中的方法

[En]

Add directly to a method in the class

class MyLoginView(views.View):
    @method_decorator(login_auth)
    def get(self, request):
        return HttpResponse("from CBV get view")

方式2

直接在类名上添加并指定

@method_decorator(login_auth, name='get')
class MyLoginView(views.View):
    def get(self, request):
        return HttpResponse("from CBV get view")

方式3

重写dispatch方法并添加作用于类中所有的方法

class MyLoginView(views.View):
    @method_decorator(login_auth)
    def dispatch(self, request, *args, **kwargs):
        super().dispatch(request,*args,**kwargs)

django中间件

概念

是django的门户,自带七个中间件,每个都有各自对应的功能,在settings.py中

自定义中间件

自定义方法

django不单有七个中间件并且每个都有很多功能和方法,除此之外django还支持自定义中间件并提供五个可以自定义的方法:

  1. process_request
  2. process_response
  3. process_view
  4. process_template_response
  5. process_excepton

使用场景

只要是全局相关的功能,都可以用中间件编写,比如用户黑名单验证、用户访问频率验证、网站全局用户身份验证等。

[En]

As long as it is globally relevant functions can be written in middleware, such as user blacklist verification, user access frequency verification, website global user identity verification.

自定义中间件步骤

  1. 创建一个任意名称的文件夹
  2. 在该文件夹内创建一个任意名称的py文件
  3. 在该py文件内编写中间件类
from django.utils.deprecation import MiddlewareMixin

class MyMiddle1(MiddlewareMixin):
    def process_request(self, request):
        print('自定义中间件:from MyMiddle1 process_request')

class MyMiddle2(MiddlewareMixin):
    def process_request(self, request):
        print('自定义中间件:from MyMiddle2 process_request')
  1. 配置文件中注册
'app01.mymiddleware.mymiddle.MyMiddle1',
'app01.mymiddleware.mymiddle.MyMiddle2'

自定义中间件方法

process_request

请求来的时候会从上往下依次执行配置文件中注册了的中间件里面的process_request方法,如果没有则直接跳过

Django中间件

如果该方法自己返回了HttpResponse对象,那么请求不再继续往后直接返回相应的数据

Django中间件

process_response

响应走的时候会从下往上依次执行配置文件中注册了的中间件里面的process_response方法,如果没有则直接跳过

Django中间件

如果该方法自己返回了HttpResponse对象,那么响应会替换成该HttpResponse对象数据,而不再是视图函数想要返回给客户端的数据

注意

如果process_request返回了HttpResponse对象 那么会从当前位置从下往上执行每一个process_response

process_view

路由匹配成功之后执行视图之前从上往下执行配置文件中注册了的中间件里面的process_view方法

Django中间件

process_template_response

视图函数执行完毕之后返回的对象中含有render属性对应一个render方法则会从下往上执行配置文件中注册了的中间件里面的process_template_response方法

Django中间件

process_exception

视图函数执行过程中报错并在返回响应的时候会从下往上执行配置文件中注册了的中间件里的process_exception方法

Django中间件

基于中间件思想编写项目

importlib模块

模块可以以字符串的形式导入

[En]

Modules can be imported in the form of strings

常规导入方式

from ccc import b
print(b)  #
print(b.name)

字符串导入方式

import importlib
module_path = 'ccc.b'
res = importlib.import_module(module_path)
print(res.name)

注意

mport importlib
module_path = 'ccc.b.name'
importlib.import_module(module_path)  # 不可以

importlib模块最小导入单位是模块文件级别

以发送提示信息为需求编写功能

方式1:封装成函数

notify.py

def send_email(msg):
    print('邮箱信息提示:%s' % msg)

def send_msg(msg):
    print('短信信息提示:%s' % msg)

def send_qq(msg):
    print('QQ信息提示:%s' % msg)

def send_all(msg):
    send_email(msg)
    send_msg(msg)
    send_qq(msg)
start.py

from notify import send_all

send_all('hello world')

邮箱信息提示:hello world
短信信息提示:hello world
QQ信息提示:hello world

方式2:封装成配置

emsil.py

class Email(object):
    def __init__(self):
        pass
    def send(self, msg):
        print('邮箱信息提示:%s' % msg)

msg.py

class Msg(object):
    def __init__(self):
        pass
    def send(self, msg):
        print('短信信息提示:%s' % msg)

qq.py

class QQ(object):
    def __init__(self):
        pass
    def send(self, msg):
        print('QQ信息提示:%s' % msg)
settings.py

NOTIFY_FUNC_LIST = [
    'notify.email.Email',
    'notify.msg.Msg',
    'notify.qq.QQ'
]
__init__.py

import settings
import importlib
def send_all(msg):
    # 1.循环获取配置文件中字符串信息
    for str_path in settings.NOTIFY_FUNC_LIST:  # 'notify.email.Email'
        # 2.切割路径信息
        module_path, class_str_name = str_path.rsplit('.', maxsplit=1)  # ['notify.email','Email']
        # 3.根据module_path导入模块文件
        module = importlib.import_module(module_path)
        # 4.利用反射获取模块文件中对应的类名
        class_name = getattr(module, class_str_name)  # Email  Msg  QQ
        # 5.实例化
        obj = class_name()
        # 6.调用发送消息的功能
        obj.send(msg)
start.py

import notify
if __name__ == '__main__':
    notify.send_all(msg)

如果你仍然需要取消其中一个功能,只需转到个人资料评论功能的这一行。

[En]

If you still need to cancel one of these features, just go to this line of the profile comment function.

增加功能参考以上代码

Django中间件

Original: https://www.cnblogs.com/zzs0626/p/16307305.html
Author: 顺溜_7
Title: Django中间件

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/499503/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

  • pip install pyqt5时报错:Preparing wheel metadata … error

    问题描述 背景:在服务器上用conda搭建TensorFlow训练环境 在安装pyqt5时遇到了这个问题: ; 解决尝试 是不是代码源出问题? pip install pyqt5 …

    Python 2023年9月9日
    0233
  • 【Python】Numpy生成等差数组

    文章目录 * – arange – linspace – 对数数组 – 小结 arange arange是Numpy中使用频率超高的…

    Python 2023年8月25日
    091
  • Pandas 全系列教程分享

    抵扣说明: 1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。 Original: https://blo…

    Python 2023年8月18日
    089
  • 矩阵快速幂

    by lcx,zjy 基础知识 矩阵:由$ m\times n$个数排成的m行n列的数表其实就是二维数组 矩阵加减法的规则:(A\pm B=C) 其中$ C[i][j]$ 为(A[…

    Python 2023年10月18日
    092
  • WebSocket实现动态可视化(三)

    上节链接:WebSocket实现动态可视化(二)上节已经实现了图表的可视化,但还有优化的地方,如x轴未实现动态,为死数据,且websocket一旦连接还未实现主动断开的操作,所以该…

    Python 2023年8月15日
    068
  • Python库-pandas详解

    Python库-pandas详解 1. pandas介绍 2. Series 3. DataFrame * 3.1 DataFrame结构 3.2 DataFrame属性与方法 3…

    Python 2023年8月23日
    0125
  • YOLOv5-6.1添加注意力机制(SE、CBAM、ECA、CA)

    目录 0. 添加方法 1. SE * 1.1 SE 1.2 C3-SE 2. CBAM * 2.1 CBAM 2.2 C3-CBAM 3. ECA * 3.1 ECA 3.2 C3…

    Python 2023年7月31日
    0229
  • DataFrame操作

    1 引入对应的库 from pandas import DataFrame #构造DataFrame data=[[1,2,3],[4,5,6],[7,8,9]] cols=[&q…

    Python 2023年8月6日
    063
  • celery 分布式异步队列框架使用方法

    简介: Celery 是一个python开发的异步分布式任务调度模块,是一个消息传输的中间件,可以理解为一个邮箱,每当应用程序调用celery的异步任务时,会向broker传递消息…

    Python 2023年6月10日
    0106
  • pytest实战练习

    pytest是单元测试框架,用作代码层测试的框架。简单、易用,很多大型开源测试框架如appium、httprunner框架也基于它实现。网页、手机应用以及接口等测试都支持,也就是p…

    Python 2023年9月9日
    064
  • 用代码收集每天热点内容信息,并发送到自己的邮箱

    前言 本篇文章内容主要为如何用代码,把你想要的内容,以邮件的形式发送出去内容可以自己完善,还可以设置一个定时发送,或者开机启动自动运行代码 代理注册与使用 注册账号并登录 ; 生成…

    Python 2023年11月1日
    092
  • 基于PythonDjango框架的电影推荐系统 毕业设计

    摘 要电影推荐网站的研究对于解决电影数据复杂性以及用户需求多样性具有重要的意义。针对电影推荐系统网站中推荐准确率低,数据稀疏和冷启动等问题,详细阐述了国外六大主流电影推荐网站系统的…

    Python 2023年8月6日
    059
  • 使用 For 循环遍历 Python 字典的 3 种方法

    在Python中,如何使用”for”循环遍历字典? 今天我们将会演示三种方法,并学会遍历嵌套字典。 在实战前,我们需要先创建一个模拟数据的字典。 dict_…

    Python 2023年8月2日
    0158
  • el-cascader组件根据最后一级向上找到父级并设置默认值

    vue + elementUI项目中,el-cascader级联选择器使用频率非常高,一些基本使用方法可以参考elementUI官方文档,本文主要研究当接口只返回最后一级id时,如…

    Python 2023年10月17日
    0115
  • Python绘图快速上手

    准备工作 使用Python绘图首先需要导入需要的库,并确保中文和负号的正常显示 import os import xlrd import pandas as pd import n…

    Python 2023年9月2日
    094
  • python进行数据分析第二章task02

    文章目录 第二章数据清洗和特征处理 * 2.1 缺失值观察与处理 – 2.1.1 缺失值观察 2.1.2对缺失值进行处理 2.2 重复值的观察与处理 特征观察和处理 &…

    Python 2023年8月7日
    059
亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球