知识点
- 概念
- 使用场景
- 中间件如何发生作用
- 自定义中间件
中间件概念
中间件是嵌入 django 的 request/response 处理过程的一套钩子框架。它是一个轻量级的底层嵌入系统,可以对 django 的输入输出做整体的修改。
使用场景
如果你想修改请求,例如被传送到view中的HttpRequest对象。 或者你想修改view返回的HttpResponse对象,这些都可以通过中间件来实现。
可能你还想在view执行之前做一些操作,这种情况就可以用 middleware来实现。
比如我们写一个判断浏览器来源,是pc还是手机,这里手机我们采用iphone,因为暂时没有其他设备。我们有不想把这个逻辑加到视图函数里,想作为一个通用服务,作为一个可插拔的组件被使用,最好的方法就是实现为中间件。
中间件作用流程
Django中间件必须是一个类,不需要继承任何类,并实现四个接口:
- process_request(self, request)该方法在请求到来的时候调用。
- process_view(self ,request, fnc , arg ,kwarg)在本次将要执行的View函数被调用前调用本函数。
- process_response(self,request,response)在执行完View函数准备将响应发到客户端前被执行。
- process_exception(self,request, exception). View函数在抛出异常时该函数被调用,得到的exception参数是实际上抛出的异常实例。通过此方法可以进行很好的错误控制,提供友好的用户界面。
中间件如何发生作用
要激活中间件,需要把它添加到Django 配置文件中的MIDDLEWARE_CLASSES 元组中。
参考文档
实验操作
获取当前访问的客户端系统信息
【middleware.py】
class CheckSoureMiddware(object):
def process_request(self, request):
from_source = request.META['HTTP_USER_AGENT']
print('from_source ',from_source)
if 'iPhone' in from_source:
request.session['from_source'] = 'iphone'
else:
request.session['from_source'] = 'pc'
def process_response(self, request, response):
res = 'hehe'
print(res)
return HttpResponse(res)
【views.py】
from django.shortcuts import render,HttpResponse
# Create your views here.
def index(request):
res = 'hi, friend! where a u from?'
from_source = request.session.get('from_source', 'unkown')
res = 'hi, friend! u come from %s' %from_source
return HttpResponse(res)
【settings.py】
MIDDLEWARE_CLASSES = [
'example.middleware.CheckSoureMiddware',
]
获取当前访问的客户端的IP
【middleware.py】
from django.http import HttpResponse
class ForbidSomeIpMiddleware(object):
def process_request(self, request):
allow_ip = ['127.0.0.1',]
ip = request.META['REMOTE_ADDR']
print('ip ', ip)
if ip in allow_ip:
print('ip not allowed')
return HttpResponse('ip not allowed')
def process_response(self, request, response):
res = 'haha'
print(res)
return HttpResponse(res)
【settings.py】
MIDDLEWARE_CLASSES = [
'example.middleware.ForbidSomeIpMiddleware',
]
结论
先注册的中间件先被调用(可以使用process_response来查看)
网友评论