当前位置:
首页 > temp > python入门教程 >
-
django--中间件
中间件的应用场景:
1, 做ip访问频率限制: 某些ip访问服务器的频率过高,进行拦截, 比如每分钟不能超过20次
2, url访问过滤: 如果用户访问的是login(登录)或者register(注册)之类的就放过,
如果访问其他视图, 需要检测是不是有session认证, 已经有了就放行,
没有就返回login, 这样就省得在多个视图函数上写装饰器了
流程
中间件: 1,先走所有的process_request,
2,再找url,
3,再走所有的process_view,
4, 再继续执行url对应的视图函数
5, 如果执行url对应的视图函数出错, 就执行中间件process_exception(反方向执行)
4, 再走所有的process_response(反方向执行)
### 如何使用中间件
对所有请求和响应做一些统一处理
自定义中间件的流程
1, 在应用中创建一个py文件, 比如mymiddleware.py
2, 文件中书写内容如下, 先要引入模块
from django.shortcuts import redirect, HttpResponse
from django.utils.deprecation import MiddlewareMixin
# 登录认证中间件
class loginAuth(MiddlewareMixin):
# 白名单
white_list = ['/login/','register']
# 对请求处理用process_request, 如果请求通过了处理, 就return None(就是可以继续往下执行), 如果没有通过直接return Httpresponse对象, 可以直接返回
def process_request(self,request):
current_path = request.path # 可以直接获取到用户请求的路径
# 判断用户请求路径是否在白名单中,
if current_path not in self.white_list:
status = request.session.get('is_login') # 获取到session值
if not status: # 判断, 如果没有session值, 就给他字符串提示,或者重定向去登录
# return HttpResponse('去登录吧')
return redirect('login')
print('请求正常通行')# 如果获取到session, 就给用户请求的路径通行
class Md1(MiddlewareMixin):
def process_request(self,request):
print('Md1-process_request')
# return HttpResponse('ojbk') #process_requestzhong中如果returnhttpresponse对象, 那么中间件执行到这里直接返回
def process_response(self,request,response):
print(response)#<HttpResponse status_code=200, "text/html; charset=utf-8">
print('Md1-process_request')
# 获取到httpresponse的最终返回值或者html文件(都是字节流类型), 可以decode成字符串, 如果是html页面, 则会展示html代码
print(response.content.decode())
response['xx'] = 'oo'
# return HttpResponse('ok') # 如果return是HTTPResponse对象, 那么替换视图函数中的返回值
return response #注意 使用process_response一定要return response, 否则报错
def process_view(self,request,view_func,view_args,view_kwargs):
print('Md1-process_view')
print(view_func, view_args,view_kwargs)
print('Md1-process_view2')
def process_exception(self,request,exception):
print('Md1-process_exception')
print(exception, type(exception))# 收集到报错信息, 可以做处理, 预防服务器故障
# 统一做异常处理
if isinstance(exception,ValueError):
return HttpResponse('有函数报错了,请及时处理',status=500)
class Md2(MiddlewareMixin):
def process_request(self,request):
print('Md2-procss_request')
def process_response(self,quest,response):
print('Md2-process_response')
return response
def process_view(self,request,view_func,view_args,view_kwargs):
print('Md2-process_view')
def process_exception(self,request,exception):
print('Md2-process_exception')
# 还有一个中间件, 很少用到
def process_template_response(self,request,response):
pass
出处:https://www.cnblogs.com/-szh/p/14088073.html
最新更新
nodejs爬虫
Python正则表达式完全指南
爬取豆瓣Top250图书数据
shp 地图文件批量添加字段
爬虫小试牛刀(爬取学校通知公告)
【python基础】函数-初识函数
【python基础】函数-返回值
HTTP请求:requests模块基础使用必知必会
Python初学者友好丨详解参数传递类型
如何有效管理爬虫流量?
2个场景实例讲解GaussDB(DWS)基表统计信息估
常用的 SQL Server 关键字及其含义
动手分析SQL Server中的事务中使用的锁
openGauss内核分析:SQL by pass & 经典执行
一招教你如何高效批量导入与更新数据
天天写SQL,这些神奇的特性你知道吗?
openGauss内核分析:执行计划生成
[IM002]Navicat ODBC驱动器管理器 未发现数据
初入Sql Server 之 存储过程的简单使用
SQL Server -- 解决存储过程传入参数作为s
关于JS定时器的整理
JS中使用Promise.all控制所有的异步请求都完
js中字符串的方法
import-local执行流程与node模块路径解析流程
检测数据类型的四种方法
js中数组的方法,32种方法
前端操作方法
数据类型
window.localStorage.setItem 和 localStorage.setIte
如何完美解决前端数字计算精度丢失与数