中间件是Django请求/响应处理的钩子框架。它是一个轻量级的、低级的“插件”系统,用于全局改变django的输入或输出。中间件以类的形式体现。每个中间件组件负责做一些特定的功能。例如,Django包含一个中间组件AuthenticationMiddleware,它使用会话将用户与请求关联起来。
2、编写中间件中间件须继承自django.utils.deprecation.MiddlewareMixin类。
中间件类需实现下列五个方法中的一个或多个:
(a)precess_request(self, request)
执行路由之前被调用,在每个请求调用,返回None或HttpRequest对象。
(b)bprocess_view(self, reqeust, callback, callback_args, callback_kwargs)
调用视图之前被调用,在每个请求上调用,返回None或HttpResponse对象。
(c)process_response(self, requst, response)
所有响应返回浏览器被调用,在每个请求上调用,返回HttpResponse对象。
(d)process_exception(self, rquest, exception)
当处理过程中抛出异常时调用,返回一个HttpResponse对象。
(e)process_template_response(self, rqeust, response)
在视图函数执行完毕且视图返回的对象中包含render方法时被调用;该方法需要返回实现了render方法的响应对象。
注:中间件中的大多数方法在返回None时表示忽略当前操作进入下一项事件,当返回HttpResponse对象时表示此请求结束,直接返回给客户端。
3、注册中间件setting.py:
MIDDLEWARE = […]
注:配置为数组,中间件被调用时以“先上到下”再“由下到上”的顺序调用。
例:
(a)middleware.py
class MyMW(MiddlewareMixin):
def process_request(self, request):
print('MyMW process_request do...')
def process_view(self, request, callback, callback_args, callback_kwargs):
print('MyMW process_view do...')
def process_response(self, request, response):
print('MyMW process_response do...')
return response
(b)view.py
def test_mw(request):
print('_____test mymw view_____')
return HttpResponse('-----test view-----')
(c)urls.py
urlpatterns = [
path('admin/', admin.site.urls),
path('test_mw/', views.test_mw)
]
(d)setting.py
MIDDLEWARE = [
'django.middleware.security.SecurityMiddleware',
'django.contrib.sessions.middleware.SessionMiddleware',
'django.middleware.common.CommonMiddleware',
'django.middleware.csrf.CsrfViewMiddleware',
'django.contrib.auth.middleware.AuthenticationMiddleware',
'django.contrib.messages.middleware.MessageMiddleware',
'django.middleware.clickjacking.XFrameOptionsMiddleware',
'middleware.mymiddleware.MyMW',
]
访问:http://192.168.28.128:8000/test_mw/
另:如果在setting.py中增加一个My_MW2,则执行顺序如下:
从中可以看出,在view执行之前是按在setting.py中注册的顺序执行的,而出来则是逆序=执行。
4、中间件执行总流程5、CSRF攻击
某些网站上包含链接、表单按钮或者JavaScript,它们会利用登录过的用户在浏览器中认证信息试图在你的网站上完成某些操作,这就是跨站伪造请求攻击CSRF(Corss-Site Request Forgey)。
(1)CSRF防范
django采用‘比对暗号’机制防范:cookies中存储暗号1,模板中表单里藏着暗号2,用户只有在本网站提交数据,暗号2才会随表单提交给服务器,django对比两个暗号,对比成功,则认为请求合法,否则违法请求,返回403代码。
(2)配置
(a)setting.py中打开django.middleware.csrf.CsrfViewMiddleware。
(b)在模板中,form标签下添加如下标签:
{ % csrf_token % }
(3)不需要csrf
如果某视图不需要django进行csrf保护,可用装饰器关闭对此视图的检查。
例:
from django.views.decorators.csrf import csrf_exempt
@csrf_exempt
def my_view(request):
return HttpResponse('csrf_exempt')
例:
(a)setting.py
MIDDLEWARE = [ … 'django.middleware.csrf.CsrfViewMiddleware', … }
(b)views.py
def test_csrf(request):
if request.method == 'GET':
return render(request, 'test_csrf.html')
elif request.method == 'POST':
return HttpResponse('---test post is ok---')
(c)urls.py
urlpatterns = [
path('admin/', admin.site.urls),
path('test_csrf', views.test_csrf),
]
(d)template/test_cdrf.html
Title



