Django中间件是什么
这篇文章主要介绍Django中间件是什么,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!
Django-中间件的介绍及使用:
1、Django简介
Django的中间件类似于Linux中的管道符;Django的中间件实质就是一个雷,类之中有Django已经定义好了一些方法;Django内部的中间件注册在setting,py文件;对全局的http请求做处理的时候可以使用中间件;中间件中的方法不一定要全部使用,需要哪个用哪个;Django的中间件继承自MiddlewareMixin这个中间件
MiddlewareMixin是调用了其内部的__call__方法,__call__方法以反射的方式执行
process_request和process_response方法。
2、中间件方法
process_request(self,request)
process_request有一个参数,就是request,这个request和视图函数中的request是一样的。
它的返回值可以是None也可以是HttpResponse对象。返回值是None的话,按正常流程继续走,交给下一个中间件处理,如果是HttpResponse对象,Django将不执行视图函数,而将相应对象返回给浏览器。
在这个方法中是没有return方法的,如果有那就会执行process_response方法,直接返回给客户端,一般情况下我们是不会在这里返回内容的,除非你有需求,判断发过来的请求过来的内容,如果不是很友好的请求,那么我们直接就可以在这返回,直接卡死,让这个请求直接都进不了我们的django中的内部程序
process_response(self,request,response)
它有两个参数,一个是request,一个是response,request就是上述例子中一样的对象,response是视图函数返回的HttpResponse对象。该方法的返回值也必须是HttpResponse对象。
在这个方法中我们必须要有return方法,这样才能一步一步的返回给客户端,当然你也可以写一些东西在response里,在这里写就是会在所有的response里都会有你所添加的内容!
process_view(self,request,view_func,view_args,view_kwargs)
该方法有四个参数
request是HttpRequest对象。view_func是Django即将使用的视图函数。(它是实际的函数对象,而不是函数的名称作为字符串。)view_args是将传递给视图的位置参数的列表.view_kwargs是将传递给视图的关键字参数的字典。view_args和view_kwargs都不包含第一个视图参数(request)。Django会在调用视图函数之前调用process_view方法。
它应该返回None或一个HttpResponse对象。 如果返回None,Django将继续处理这个请求,执行任何其他中间件的process_view方法,然后在执行相应的视图。 如果它返回一个HttpResponse对象,Django不会调用适当的视图函数。 它将执行中间件的process_response方法并将应用到该HttpResponse并返回结果。
先执行路由匹配,再执行process_view方法,再执行视图函数
这个方法中是没有return方法的,如果有那就走process_response方法,视图函数不会执行
process_exception(self,request,exception)
该方法两个参数:
一个HttpRequest对象一个exception是视图函数异常产生的Exception对象。
这个方法只有在视图函数中出现异常了才执行,它返回的值可以是一个None也可以是一个HttpResponse对象。如果是HttpResponse对象,Django将调用模板和中间件中的process_response方法,并返回给浏览器,否则将默认处理异常。如果返回一个None,则交给下一个中间件的process_exception方法来处理异常。它的执行顺序也是按照中间件注册顺序的倒序执行。
process_template_response(self,request,response)
它的参数,一个HttpRequest对象,response是TemplateResponse对象(由视图函数或者中间件产生)。
process_template_response是在视图函数执行完成后立即执行,但是它有一个前提条件,那就是视图函数返回的对象有一个render()方法(或者表明该对象是一个TemplateResponse对象或等价方法)。
3、中间件的应用
基于中间件实现简单用户登录验证
中间件版的登录验证需要依靠session,所以数据库中要有django_session表。
定义路由fromdjango.conf.urlsimporturlfromapp01importviewsurlpatterns=[url(r'^index/$',views.index),url(r'^login/$',views.login,name='login'),]
视图函数
fromdjango.shortcutsimportrender,HttpResponse,redirectdefindex(request):returnHttpResponse('thisisindex')defhome(request):returnHttpResponse('thisishome')deflogin(request):ifrequest.method=="POST":user=request.POST.get("user")pwd=request.POST.get("pwd")ifuser=="Q1mi"andpwd=="123456":#设置sessionrequest.session["user"]=user#获取跳到登陆页面之前的URLnext_url=request.GET.get("next")#如果有,就跳转回登陆之前的URLifnext_url:returnredirect(next_url)#否则默认跳转到index页面else:returnredirect("/index/")returnrender(request,"login.html")
定义页面login.html
<!DOCTYPEhtml><html><head><metacharset="UTF-8"><metahttp-equiv="x-ua-compatible"content="IE=edge"><metaname="viewport"content="width=device-width,initial-scale=1"><title>登录页面</title></head><body><formaction="{%url'login'%}"><p><labelfor="user">用户名:</label><inputtype="text"name="user"id="user"></p><p><labelfor="pwd">密码:</label><inputtype="text"name="pwd"id="pwd"></p><inputtype="submit"value="登录"></form></body></html>
定义中间件middlewares.py
c
lassAuthMD(MiddlewareMixin):white_list=['/login/',]#白名单balck_list=['/black/',]#黑名单defprocess_request(self,request):fromdjango.shortcutsimportredirect,HttpResponsenext_url=request.path_infoprint(request.path_info,request.get_full_path())ifnext_urlinself.white_listorrequest.session.get("user"):returnelifnext_urlinself.balck_list:returnHttpResponse('ThisisanillegalURL')else:returnredirect("/login/?next={}".format(next_url))
注册
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','middlewares.AuthMD',]
AuthMD中间件注册后,所有的请求都要走AuthMD的process_request方法。
访问的URL在白名单内或者session中有user用户名,则不做阻拦走正常流程;
如果URL在黑名单中,则返回This is an illegal URL的字符串;
正常的URL但是需要登录后访问,让浏览器跳转到登录页面。
注:AuthMD中间件中需要session,所以AuthMD注册的位置要在session中间的下方。
以上是Django中间件是什么的所有内容,感谢各位的阅读!希望分享的内容对大家有帮助,更多相关知识,欢迎关注亿速云行业资讯频道!
声明:本站所有文章资源内容,如无特殊说明或标注,均为采集网络资源。如若本站内容侵犯了原著者的合法权益,可联系本站删除。