首页 > 其他分享 >Django-中间件

Django-中间件

时间:2022-12-22 20:23:57浏览次数:39  
标签:process request py 中间件 Django response view

1.Django中间件及两个重要方法

1.django有7个中间件,并且还支持用户自定义中间件。

2.当我们完成一些全局相关的功能(例如用户访问频率)、权限(中间件会获取到用户的权限以及访问的路由,并且查看该用户是否有该路由的权限)时需要用到中间件。

3.Django的中间件在settings中的MIDDLEWARE内。在中间件中我们发现中间件其实是一个类,但是多个类中都有两个相同的方法:process_request和process_response。
    
4.如何自定义中间件:
	4.1在应用或者django项目下自定义目录
	4.2参考自带中间件的代码编写并继承
	4.3在类中编写五个可以自定义的方法(允许个别没有):
   需要掌握:
		process_request
		process_response
   需要了解:     
		process_view
		process_exception
		process_template_response
        
5.中间件写好之后一定要在settings.py中的MIDDLEWARE中注册中间件才可以使用。

6.process_request:除了self还需一个参数request。请求来的时候会从上往下依次执行每一个注册了的中间件(类)中的process_request方法(函数)。没有该方法的中间件会依次跳过。MIDDLEWARE中中间件中排名越靠前,就限执行谁的该方法。
并且如果该方法返回了Httpresponse对象,那么就直接原路返回不再往后执行。

7.process_response:除了self还需两个参数request和response。请求走的时候会从下往上依次经过每一个中间件的该方法。response就是需要处理的数据。并且process_response方法还有返回值,返回值是response(也可以替换)。

8.如果在执行process_request方法的时候直接返回了HttpResponse对象,网络请求就不会再走下面的MyMiddleware2,而是直接走MyMiddleware1中的process_response,不再经过MyMiddleware2。

2.Django中间件三个了解的方法

1.process_view:路由能匹配成功之后,视图函数/类执行之前执行(顺序同request_request)。process_view需要4个形参:
def process_view(self,request,view_func,view_args,view_kwargs):
    print('from Mymiddleware2 process_view')
"""
并且当我们打印几个参数发现,view_func,view_args,view_kwargs分别是函数名,函数的参数。
print(view_func,view_args,view_kwargs)  # <function index at 0x000002358F8D43A0> () {}
"""

2.process_exception:当视图函数报错之后触发,有两个形参:request,exception。exception是报错信息。在执行完视图函数之后,执行process_response之前执行。
def process_exception(self,request,exception):
    print(exception)  # name 'aaaaa' is not defined
    print('from Mymiddleware1 process_exception')  

3.process_template_response
	视图函数/类返回的HttpResponse对象含有render并且对应一个方法的时候自动触发(顺序同process_response)

3.基于Django中间件的功能设计

1.Django中间件的字符串并不是真的字符串,而是将各个功能制作成配置文件的字符串形式,如果想拥有该功能就编写对应的字符串,如果不用这个功能就注释掉相印的字符串。

2.如何解决字符串导入模块的问题?importlib模块可以字符串变成模块导入的形式:
from aaa import a
print(a)  # <module 'aaa.a' from 'D:\\上海python金牌班\\20221222 day66 Django\\abc\\aaa\\a.py'>

s1 = 'aaa.a'
import importlib
res = importlib.import_module(s1)
print(res)  # <module 'aaa.a' from 'D:\\上海python金牌班\\20221222 day66 Django\\abc\\aaa\\a.py'>
变量名a和res指代的都是一个模块名,并且它们的结果一样,说明importlib.import_module(变量名)可以将字符串转化为导入模块的形式。
"""
该模块实现的底层原理是:将字符串按照最右边的.分割,前一部分是路径,后一部分是模块文件名,所以也意味着该模块实现的最小单位(字符串的结尾)是模块文件名而不是文件里面的名字。
'aaa.bbb.b'>>>from aaa.bbb import c
"""

3.利用中间件原理设计功能:模拟用qq,email,微信发送同一句消息,并且同时发送。我们可以分别涉及几个函数,再用一个函数将它们封起来,传入参数,也可以实现。
第二种方法:参考中间件原理,利用字符串路径拿到模块名称,在利用反射,拿到指定的类,生成多个对象,分别点不同类之间的方法。
目录结构:
总目录:
	dictory
		settings.py
		start.py
	notify
		_init_.py
		email.py
		qq.py
		wechat.py
代码:
settings.py:  # 用于路径拆分
notify = [
    'notify.email.Email',
    'notify.qq.Qq',
    'notify.wechat.Wechat'
]
    
start.py:  # 启动文件
import notify

if __name__ == '__main__':
    notify.send_all('今天星期天')
    
_init_.py:
from dictory import settings
import importlib

def send_all(content):
    for notify_str in settings.notify:  # 'notify.email.Email'
        # 1.先分割,拿到的是字符串的模块名,类名
        module_path,class_str_name = notify_str.rsplit('.',maxsplit=1)
        # 2.通过字符串路径拿到模块文件
        module_name = importlib.import_module(module_path)
        # 3.模块文件可以看做对象,利用反射拿到类名
        class_name = getattr(module_name,class_str_name)
        obj = class_name()
        obj.send_msg('圣诞节的密码')  # 多个类中有相同名称的功能,体现了多态性
        
email.py:
class Email(object):
    def __init__(self):
        pass  # 模拟发送消息前的一些操作

    def send_msg(self,content):
        print('来自于Email的消息:%s' % content)
        
qq.py:
class Qq(object):
    def __init__(self):
        pass

    def send_msg(self,content):
        print('来自qq的消息:%s' % content)
        
wechat.py:
class Wechat(object):
    def __init__(self):
        pass

    def send_msg(self,content):
        print('来自wechat的消息:%s' % content)

标签:process,request,py,中间件,Django,response,view
From: https://www.cnblogs.com/zkz0206/p/16999502.html

相关文章

  • Django-cookie和session
    1.cookies与session简介1.最早期的互联网不需要保存用户信息,所有用户哪怕之前成功登陆每次用户登录也要重新输入账号和密码。2.cookie:保存在客户端与用户状态相关的数......
  • 12月22日内容总结——django中间件的三个了解要求的方法、基于django中间件的功能设计
    目录一、django中间件三个了解的方法二、django中间件五个方法的执行流程详解三、基于django中间件的功能设计功能设计介绍如何利用字符串导入模块功能模拟四、cookie与ses......
  • django中的orm
    fromdjango.dbimportmodels#Createyourmodelshere."""1.定义模型类2.模型迁移2.1先生成迁移文件(不会在数据库中生成表,只会创建一个数据表和模型的对应关系)......
  • 中间件写法2
    """中间件的作用:每次请求和相应的时候都会调用中间件的定义中间件的使用:我们可以判断每次请求中是否携带了cookie中某些信息"""fromdjango.httpimportHttpResponsede......
  • django之cookie与session
    目录cookie与session简介django操作cookiedjango操作sessioncookie与session简介"""回忆:HTTP协议四大特性 1.基于请求响应 2.基于TCP、IP作用于应用层之上的协议 3.......
  • django之中间件(middleware)
    django之中间件(middleware)在之前一篇博文中,有关django的请求流程中,我们关于中间件这一层并没有详细的介绍,在这张图中,我们将中间层定义为django网关层和路由层的过渡层,那么......
  • django中间件三个了解的方法、 基于django中间件的功能设计、 cookie与session简介、
    目录django中间件三个了解的方法基于django中间件的功能设计cookie与session简介django操作cookiedjango操作cookiedjango操作sessiondjango中间件三个了解的方法1.proc......
  • Django增删改查
    增删改查。配置对应路由,函数,视图。报错注意看控制台。添加取到前台传来的参数,后端给予验证。入库编辑,取到当前编辑得id,在后台查到对应数据。重新update删除,取到当前点......
  • 第二章:Django的基础操作及配置
    Python三大主流后端框架"""Django 特点:大而全,自带的功能特别多 缺点:有时候过于笨重flask 特点:小而精,自带的功能特别少 但是第三方模块非常的多,如果将flask第三......
  • 计算存储分离在京东云消息中间件JCQ上的应用
    作者:田寄远JCQ全名JDCloudMessageQueue,是京东云自研、具有CloudNative特性的分布式消息中间件。JCQ设计初衷即为适应云特性的消息中间件;具有高可用、数据可靠性......