中间件------------------------>>>>>>>>>>>>>中间件是一个用来处理django的响应与请求的框架级别的钩子.它是一个轻量,低级别的插件系统,

用于在全局范围内改变django的输入和输出,每个中间件组件都负责做一些特定的功能.----简单来说,Django的中间件是一个类。用来在全局范围内处理请求和响应。

process_request(self,request)

process_view(self, request, view_func, view_args, view_kwargs)

process_template_response(self,request,response)

process_exception(self, request, exception)

process_response(self, request, response)1. process_request1. 执行时间

在视图函数之前执行2. 参数

request 和视图中的request是同一个3. 返回值

返回None

返回response对象

不执行后面中间的process_request方法和视图

直接执行当前值中间件的process_response方法4. 执行顺序

按照注册的顺序执行2. process_response1. 执行时间

在视图函数之后执行2. request, response

request 和视图中的request是同一个

response 返回的response对象3. 返回值

返回response对象4. 执行顺序

按照注册的倒序执行3. process_view1. 执行时间

在视图函数之前,process_request之后执行2. 参数

view_func 将要执行的视图函数

view_args 视图函数的可变长位置参数

view_kwargs 视图函数的可变长关键字参数3. 返回值

返回 None 正常执行

返回 response对象 不执行后面的process_view和视图,直接执行所有中间件的process_response方法4。执行顺序

按照注册的顺序执行4. process_exception(有条件触发:有错误才执行)1. 执行时间

在视图函数之后,process_response之前执行2. 参数

exception 错误对象3. 返回值

返回 None 不对错误进行处理,交给下一个中间件进行处理

返回 response对象 下一个中间的process_exception不执行,直接执行所有中间件的process_response方法4. 执行顺序

按照注册的倒序执行5. process_template_response(条件触发:视图返回的response有render方法)1. 执行时间

在视图函数之后,process_response之前执行2. 参数3. 返回值

返回 response对象4. 执行顺序

按照注册的倒序执行,执行完所有的process_template_response方法后执行response.render方法

中间件的执行流程

上一部分,我们了解了中间件中的5个方法,它们的参数、返回值以及什么时候执行,现在总结一下中间件的执行流程。

请求到达中间件之后,先按照正序执行每个注册中间件的process_reques方法,process_request方法返回的值是None,就依次执行,如果返回的值是HttpResponse对象,不再执行后面的process_request方法,而是执行当前对应中间件的process_response方法,将HttpResponse对象返回给浏览器。也就是说:如果MIDDLEWARE中注册了6个中间件,执行过程中,第3个中间件返回了一个HttpResponse对象,那么第4,5,6中间件的process_request和process_response方法都不执行,顺序执行3,2,1中间件的process_response方法。

process_request方法都执行完后,匹配路由,找到要执行的视图函数,先不执行视图函数,先执行中间件中的process_view方法,process_view方法返回None,继续按顺序执行,所有process_view方法执行完后执行视图函数。假如中间件3 的process_view方法返回了HttpResponse对象,则4,5,6的process_view以及视图函数都不执行,直接从最后一个中间件,也就是中间件6的process_response方法开始倒序执行。

process_template_response和process_exception两个方法的触发是有条件的,执行顺序也是倒序。总结所有的执行流程如下:

小练习:

(1)

AuthMD中间件注册后,所有的请求都要走AuthMD的process_request方法。

如果URL在黑名单中,则返回This is an illegal URL的字符串;

访问的URL在白名单内或者session中有user用户名,则不做阻拦走正常流程;

正常的URL但是需要登录后访问,让浏览器跳转到登录页面。

注:AuthMD中间件中需要session,所以AuthMD注册的位置要在session中间的下方。

from django.conf.urls importurlfrom django.contrib importadminfrom app01 importviews

urlpatterns=[

url(r'^admin/', admin.site.urls),

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

url(r'^home/',views.home),

url(r'^index/',views.index),

url(r'^logout/',views.logout),

]

urls

from django.shortcuts importrender,HttpResponse,redirectfrom django.conf importglobal_settings#Create your views here.

deflogin(request):

err_msg= ""

if request.method == "POST":

name= request.POST.get("name")

pwd= request.POST.get("pwd")if name == "alex" and pwd == "123":

request.session['user'] = "user"

#request.session.set_expiry(0) #设置关闭浏览器后自动注销

return_path = request.GET.get("return","")ifreturn_path:returnredirect(return_path)else:return redirect("/home/")else:

err_msg= "用户名或者密码错误"

return render(request,"login.html",{"err_msg":err_msg})#登陆装饰器#def wrap(func):#def inner(request,*args,**kwargs):#if request.session.get("is_login","") == "True":#ret = func(request,*args,**kwargs)#return ret#else:#path = request.path_info#return redirect("/login/?return={}".format(path))#return inner

#@wrap

defhome(request):return render(request,"home.html")#@wrap

defindex(request):return render(request,"index.html")deflogout(request):del request.session['user']return redirect("/login/")

Views文件

from django.utils.deprecation importMiddlewareMixinfrom django.shortcuts importHttpResponse, redirect, renderclassLogin_middle(MiddlewareMixin):

white_list= ["/login/", ]

black_list= ["/black/", ]defprocess_request(self, request):

path=request.path_infoif path inself.black_list:return HttpResponse("这是黑名单的网址")elif path in self.white_list or request.session.get("user"):print(11)return

else:print(22)return redirect("/login/?return={}".format(path))

中间件

'app01.my_middlewaremixin.Login_middle'

settings注册中间件

#login.html

Title{% csrf_token %}

用户名:

密码:

提交

{{ err_msg }}

#index.html

Title

欢迎登陆index页面

#home.html

Title

欢迎登陆home页面

注销

template文件 (三个)

(2) 限制访问频率,一分钟只能访问3次.

思路:根据IP做判断,1分钟只能访问3次

1. 获取ip

2. 记录时间

3. 根据访问记录做判断

importtime

l={}classThrottle(MiddlewareMixin):defprocess_request(self, request):

ip= request.META.get("REMOTE_ADDR")

now=time.time()if not l.get(ip, ""):

l[ip]=[]

history=l[ip]

x=[]for i inhistory:if now - i < 5:

x.append(i)print(x)

history=xprint(history)if len(history) >= 3:return HttpResponse("次数太多了")

history.insert(0, now)

l[ip]= history

中间件代码

request.META 可以获取到所有内容,可以从中找你想用的东西.一组组键值对儿

#{'ALLUSERSPROFILE': 'C:\\ProgramData',#'APPDATA': 'C:\\Users\\zhanghutao\\AppData\\Roaming',#'COMMONPROGRAMFILES': 'C:\\Program Files\\Common Files',#'COMMONPROGRAMFILES(X86)': 'C:\\Program Files (x86)\\Common Files',#'COMMONPROGRAMW6432': 'C:\\Program Files\\Common Files',#'COMPUTERNAME': 'DESKTOP-30PDHUE',#'COMSPEC': 'C:\\WINDOWS\\system32\\cmd.exe',#'DJANGO_SETTINGS_MODULE': '中间件.settings',#'HOMEDRIVE': 'C:', 'HOMEPATH': '\\Users\\zhanghutao',#'LOCALAPPDATA': 'C:\\Users\\zhanghutao\\AppData\\Local',#'LOGONSERVER': '\\\\DESKTOP-30PDHUE',#'MOZ_PLUGIN_PATH': 'E:\\Foxit Reader\\plugins\\',#'NUMBER_OF_PROCESSORS': '4',#'ONEDRIVE': 'C:\\Users\\zhanghutao\\OneDrive',#'OS': 'Windows_NT',#'PATH': 'C:\\WINDOWS\\system32;'#'C:\\WINDOWS;'#'C:\\WINDOWS\\System32\\Wbem;'#'C:\\WINDOWS\\System32\\WindowsPowerShell\\v1.0\\;'#'C:\\Program Files\\WIDCOMM\\Bluetooth Software\\;C:\\Program Files\\WIDCOMM\\Bluetooth Software\\syswow64;D:\\mysql\\mysql-5.7.23-winx64\\bin;;D:\\PPB\\PBB Reader\\x64;D:\\python3.6\\Scripts\\;D:\\python3.6\\;C:\\Users\\zhanghutao\\AppData\\Local\\Microsoft\\WindowsApps;;D:\\python3.6\\lib\\site-packages\\pywin32_system32;D:\\python3.6\\lib\\site-packages\\pywin32_system32', 'PATHEXT': '.COM;.EXE;.BAT;.CMD;.VBS;.VBE;.JS;.JSE;.WSF;.WSH;.MSC', 'PROCESSOR_ARCHITECTURE': 'AMD64', 'PROCESSOR_IDENTIFIER': 'Intel64 Family 6 Model 58 Stepping 9, GenuineIntel', 'PROCESSOR_LEVEL': '6', 'PROCESSOR_REVISION': '3a09', 'PROGRAMDATA': 'C:\\ProgramData', 'PROGRAMFILES': 'C:\\Program Files', 'PROGRAMFILES(X86)': 'C:\\Program Files (x86)', 'PROGRAMW6432': 'C:\\Program Files', 'PSMODULEPATH': 'C:\\Program Files\\WindowsPowerShell\\Modules;C:\\WINDOWS\\system32\\WindowsPowerShell\\v1.0\\Modules;C:\\Program Files\\Intel\\Wired Networking\\', 'PUBLIC': 'C:\\Users\\Public', 'PYCHARM_HOSTED': '1', 'PYCHARM_MATPLOTLIB_PORT': '54693', 'PYTHONIOENCODING': 'UTF-8', 'PYTHONPATH': 'D:\\pycharm\\PyCharm 2018.1.3\\helpers\\pycharm_matplotlib_backend;D:\\PythonTest\\django项目\\中间件', 'PYTHONUNBUFFERED': '1', 'SESSIONNAME': 'Console', 'SYSTEMDRIVE': 'C:', 'SYSTEMROOT': 'C:\\WINDOWS', 'TEMP': 'C:\\Users\\ZHANGH~1\\AppData\\Local\\Temp', 'TMP': 'C:\\Users\\ZHANGH~1\\AppData\\Local\\Temp', 'USERDOMAIN': 'DESKTOP-30PDHUE', 'USERDOMAIN_ROAMINGPROFILE': 'DESKTOP-30PDHUE', 'USERNAME': 'zhanghutao', 'USERPROFILE': 'C:\\Users\\zhanghutao', 'WINDIR': 'C:\\WINDOWS', 'RUN_MAIN': 'true', 'SERVER_NAME': 'DESKTOP-30PDHUE', 'GATEWAY_INTERFACE': 'CGI/1.1', 'SERVER_PORT': '8000', 'REMOTE_HOST': '', 'CONTENT_LENGTH': '', 'SCRIPT_NAME': '', 'SERVER_PROTOCOL': 'HTTP/1.1', 'SERVER_SOFTWARE': 'WSGIServer/0.2', 'REQUEST_METHOD': 'GET', 'PATH_INFO': '/index/', 'QUERY_STRING': '',#'REMOTE_ADDR': '127.0.0.1',#'CONTENT_TYPE': 'text/plain',#'HTTP_HOST': '127.0.0.1:8000',#'HTTP_CONNECTION': 'keep-alive', 'HTTP_UPGRADE_INSECURE_REQUESTS': '1', 'HTTP_USER_AGENT': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/66.0.3359.170 Safari/537.36', 'HTTP_ACCEPT': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8', 'HTTP_ACCEPT_ENCODING': 'gzip, deflate, br', 'HTTP_ACCEPT_LANGUAGE': 'zh-CN,zh;q=0.9', 'HTTP_COOKIE': 'csrftoken=HSERiDbpYwWLfLhrjDIgcsMP8HjD1CqXuSPjgSD40l8YpqbMPTYaNKl3xm6MLWne; sessionid=qfrad5a76h2ozt0erj74wef1nrzsl63n', 'wsgi.input': <_io.bufferedreader name="964">, 'wsgi.errors': <_io.textiowrapper name="<stderr>" mode="w" encoding="UTF-8">, 'wsgi.version': (1, 0), 'wsgi.run_once': False, 'wsgi.url_scheme': 'http', 'wsgi.multithread': True, 'wsgi.multiprocess': False, 'wsgi.file_wrapper': , 'CSRF_COOKIE': 'HSERiDbpYwWLfLhrjDIgcsMP8HjD1CqXuSPjgSD40l8YpqbMPTYaNKl3xm6MLWne'}

例如:

python 通信中间件_python 终极篇 ---- 中间件相关推荐

  1. python通信原理_python入门第三十三天--网络通信原理(补充)

    1.互联网的本质就是一系列的网络协议 一台硬设有了操作系统,然后装上软件你就可以正常使用了,然而你也只能自己使用 像这样,每个人都拥有一台自己的机器,然而彼此孤立 英语成为世界上所有人通信的统一标准, ...

  2. python tree结构_Python入门篇-数据结构树(tree)篇

    Python入门篇-数据结构树(tree)篇 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.树概述 1>.树的概念 非线性结构,每个元素可以有多个前躯和后继 树是n(n& ...

  3. python 采集新闻_Python多篇新闻自动采集

    昨天用python写了一个天气预报采集,今天趁着兴头写个新闻采集的. 目标是,将腾讯新闻主页上所有新闻爬取下来,获得每一篇新闻的名称.时间.来源以及正文. 接下来分解目标,一步一步地做. 步骤1:将主 ...

  4. python高级功能_python高级篇

    1.切片功能:类似于java中的split方法.对list或者triple中几个值进行取出的过程. L = ['a','b','c','d']   L[0:3] = ['a','b','c']   # ...

  5. python列表操作程序_Python入门篇(三)之列表

    1.列表定义 names = ["ZhangYang","Guyun","Xiangpeng","Xuliangchen" ...

  6. python通信编程_python 通信编程

    {"moduleinfo":{"card_count":[{"count_phone":1,"count":1}],&q ...

  7. python通信信号处理_python学习笔记——信号模块signal(示例代码)

    基于python学习笔记--多进程间通信--Linux信号基础的学习基础,进一步学习Python标准库中的signal模块. 尽管signal是python中的模块,但是主要针对UNIX平台(比如Li ...

  8. python 沪江_Python基础篇 -- 字符串

    大小写转来转去 s = s1.capitalize() #首字母大写 s = s1.lower () #全部转换成小写 s = s1.upper () #全部转换成大写 while True: con ...

  9. python控制软件操作流程_python入门篇之介绍和流程控制(一)

    Python入门 一.第一句python代码 很多语言的第一句python代码都是以"你好,世界"开始的,那么我们的python也是如此. 在 /home/dev/ 目录下创建 h ...

  10. python输入姓名_Python基础篇--输入与输出

    在任何语言中,输入和输出都是代码最基础的开始, so,先来聊一聊输入和输出 输出 在python中,我们一般用print() 输出,在括号里输入你想输出的信息,用引号包裹起来(单双三都可以),例如我们 ...

最新文章

  1. C++两个队列实现一个栈
  2. 在php中单引号和双引号的区别错误的是___________,浅谈PHP中单引号和双引号到底有啥区别呢?...
  3. 如何让本机时间与局域网的一台电脑的日期同步?
  4. 【133】常见问题解答
  5. nacos 配置中心和注册中心依赖后报错,提示 org.apache.http.impl.client.HttpClientBuilder 这个类找不到
  6. Elasticsearch概述、ES概念、什么是搜索、全文检索、Elasticsearch功能,什么是distributed document store(来自网络+学习资料)
  7. django-oscar的默认地点打开后总是united kingdom
  8. 基于External-DNS的多集群Service DNS实践
  9. 如何打造园本特色_如何确立办园特色
  10. 动态规划——环形子数组的最大和(Leetcode 918)
  11. python gzip压缩_Python gzip –压缩解压缩
  12. C/C++程序员面试宝典-2
  13. 计算机桌面显示保护眼睛设置,电脑屏幕怎么设置才能保护眼睛
  14. QT 打开PDF文件或图片
  15. GD32F130之LVD低压检测
  16. office2016专业增强版cmd安装
  17. intellij idea报错:类文件具有错误的版本 61.0, 应为 52.0
  18. json字符串转成 json对象 json对象转换成java对象
  19. http缓存和浏览器缓存
  20. RTC时钟晶振为什么都是32.768K

热门文章

  1. 通信网络与IP网络底层传输技术梳理(SONET/SDH/OTN/ATM/Ethernet/MPLS/PTN...)
  2. 2021不堪回首,2022满路荆棘,但依然乐观努力
  3. 耳机在电脑上测试有声音,但是网页和视频没有声音
  4. 设计模式六大原则详解
  5. 【Android驱动】高通msm8953背光流程
  6. liunx 用户管理(增加、删除、修改密码)
  7. [转]失业七个月,面试六十家公司的深圳体验(转贴)
  8. php条件 效率高,PHP高效率写法
  9. C++中如何创建一个类?
  10. Transit VPC Transit Gateway