Django高级技巧之中间件
一、什么是中间件
中间件是Django请求/响应处理的钩子框架。它是一个轻量级的、低级的“插件”系统,用于全局改变Django的输入或输出。
中间件以类的形式体现
每个中间件组件负责做一些特定的功能。例如, Django包含一个中间件组件AuthenticationMiddleware,它使用会话将用户与请求关联起来。
类似于告诉的收费站、输入输出都要看看,在主路由前、View前、响应都会有
二、编写中间件
中间件类须继承自django.utils.deprecation.MiddlewareMixin类中间件类须实现下列五不方法中的一个或多个:
process request(self, request)执行路由之前被调用,在每个请求上调用,返回None(可以走)或HttpResponse对象(打断引导、过滤请求)
process_view(self, request, callback, callback_args. callback_kwargs)调用视图之前被调用,在每个请求上调用,返回None或HttpResponse对象#callback视图函数名字,view_args将要执行视图函数的位置参数,view_kwargs将要执行视图函数的关键字参数
process_response(self, request, response) 所有响应返回浏览器被调用,在每个请求上调用,返回 HttpResponse对象
process_exception(self, request,exception) 当处理过程中抛出异常时调用,返回一个HttpResponse对象
process_template_response(self, request, response)在视图函数执行完毕且试图返回的对象中包含render方法时被调用;该方法需要返回实现了render方法的响应对象
注:[中间件中的大多数方法在返回None时表示忽略当前操作进入下一项事件,当返回HttpResponese对象时表示此请求结束,直接返回给客户端
三、注册中间件
settings. py中需要注册一下自定义的中间件file :settings.py
在项目目录下与manage.py同级那个创建middleware(名字随意),创建_init_.py文件,在创建一个python文件进行编写
MIDDLEWARE=[
‘midleware.mymiddleware.MyMW’#文件夹+文件名+类名
…]
注意:配置为数组,中间件被调用时以’先上到下’再’由下到上’的顺序调用,也就是按照注册顺序(在进入视图函数前),从视图函数出来以后由下到上!!!!!!
案例:过滤访问次数为5次的IP
提示:request.META['REMOTE_ADDR']可以得到远程客户端的IP地址
request.path_info可以得到客户端访问的请求路由信息
class middle(MiddlewareMixin):
visit_times = {}
def process_request(self,request):
ip_address=request.META['REMOTE_ADDR']
path_url=request.path_info
if not re.match('^/test',path_url):
return
times=self.visit_times.get(ip_address,0)
self.visit_times[ip_address]=times+1
if times<5:
return
return HttpResponse("您已经访问过%s"%(times)+"禁止访问")
四、CSRF 跨站伪造请求攻击
某些恶意网站上包含链接、表单按钮或者JavaScript,它们会利用登录过的用户在浏览器中的认证信息试图在你的网站上完成某些操作,这就是跨站请求伪造(CSRF, 即Cross-Site Request Forgey),因为有些数据存储在浏览器
django采用’比对暗号机制防范攻击
Cookies中存储暗号1,模板中表单里藏着暗号2,用户只有在本网站下提交数据,暗号2才会随表单提交给服务器, django对比两个暗号,对比成功,则认为是合法请求,杏则是违法请求403响应码
防范方法
配置步骤
settings. py中确认MIDDLEWARE中 django middleware csrf. CsrfViewMiddleware是否打开
模板中,form标签下添加如下标签 {%csrf_token %}
特殊说明:
如果某个视图不需要django进行csrf保护,可以用装饰器关闭对此视图的检查
样例: from django.views.decorators.csrf import csrf_exempt
@csrf_exempt
def my_view(request): return HttpResponse(‘Hello world’)
Comments NOTHING