django 403,django笔记
学习笔记仅供参考,有错必究。
文章目录中间件中间件中间件类编写中间密钥为例
中间密钥中间件
中间件是Django请求/响应处理的钩子框架。它是一个轻量级的、底层的插件系统(有插件可以增加功能,没有插件不影响使用),用于全局改变Django的输入(请求)或输出(响应)。
每个中间件组件负责完成一些特定的功能。例如,中间件组件AuthenticationMiddleware,它使用会话将用户与请求相关联。
settings.py下的中间件列表
中间件=[
django . middleware . security . security middleware ,
django . contrib . sessions . middleware . session middleware ,
django . middleware . common . common middleware ,
# django . middleware . csrf . csrfviewmiddleware ,
django . contrib . auth . middleware . authenticationmiddleware ,
django . contrib . messages . middleware . message middleware ,
django . middleware . click jacking . xframeoptions middleware ,
]
中间件类
中间密钥必须从django.utils .折旧. middlewaremixin类继承。
中间件类必须实现以下五种方法中的一种或多种:
每个请求都会调用DEF process _ request (self,request),在视图处理执行之前调用。它返回一个None或HttpResponse对象。如果返回None,它将继续调用视图处理函数。如果返回给HttpResponse对象,就没有必要调用视图处理函数。DEF process _ view (self,request,callback,callback _ args,callback _ kwargs)调用None each request,在执行视图处理之前调用,def process_response(self,request,response)在每次请求时调用,在所有响应返回浏览器之前调用。返回的必须是HttpResponse对象defprocess _ exception (self,request,exception),在处理过程中抛出异常时调用。在执行视图后,立即返回每个请求要调用的HttpResponse对象def process _ template _ Response(self,request,response ),并返回实现render方法的response对象。注意,当中间件中的大多数方法返回None时,意味着忽略当前操作,进入下一个事件。当HTTPRESPONSE对象返回时,意味着请求结束,直接返回给客户端。
写入中间密钥
# file:middleware/my middleware . py
从django.http导入HttpResponse,Http404
从django.utils.deprecation导入MiddlewareMixin
MyMiddleWare类(MiddlewareMixin):
def process_request(自身,请求):
打印(调用中间件方法process_request)
#在浏览器和url管理器之间截取
def process_view(self,request,callback,callback_args,callback_kwargs):
打印(调用中间件方法process_view)
#在url管理器和视图之间截取
def process_response(自身、请求、响应):
打印(调用中间件方法process_response)
返回响应
#在视图和浏览器之间
def process_exception(自身、请求、异常):
打印(“调用中间件方法process_exception”)
def process_template_response(自身、请求、响应):
打印(调用中间件方法process_template_response)
返回响应
在我们写完中间密钥之后,我们还需要注册中间密钥(标记它的位置):
# file : settings.py
中间件=[
.
中间件. mymiddleware.MyMiddleWare ,
]
例如
现在,我们在前面博客的基础上,在图书管理系统中做一个项目。我们写一个中间密钥,让未登录的用户无法访问栈(访问时会报告404),登录的用户可以访问栈。
我们在项目下创建一个新文件夹mymiddleware,专门用于中间密钥。在该文件夹下,我们创建一个checklogin.py文件:
现在,我们写出这个中间键:
从django.http导入HttpResponse
从django.http导入HttpResponseRedirect
从django.utils.deprecation导入MiddlewareMixin
MyMiddleWare类(MiddlewareMixin):
def process_request(自身,请求):
Print(调用中间件MyMiddleWare.process_request方法)
返回None以注册此中间密钥:
中间件=[
django . middleware . security . security middleware ,
django . contrib . sessions . middleware . session middleware ,
django . middleware . common . common middleware ,
# django . middleware . csrf . csrfviewmiddleware ,
django . contrib . auth . middleware . authenticationmiddleware ,
django . contrib . messages . middleware . message middleware ,
django . middleware . click jacking . xframeoptions middleware ,
my middleware . check log in . my middleware ,
]注意中间键的格式是文件夹名,模块名,类名。
现在,我们打开服务,向主页3358127.0.0.1: 8000/发出请求,查看cmd接口:
2020年6月24日00时13分50秒
Django版本2.2.13,使用设置 mywebsite_bookstore.settings
在http://127.0.0.1:8000/启动开发服务器
用CTRL-BREAK退出服务器。
调用中间件MyMiddleWare.process_request方法。
[24/Jun/2020 00:13:54] GET/HTTP/1.1 200 368可以看出,在我们向homepage/发出请求之前调用了中间键。
现在,让我们改变我们的中间键:
MyMiddleWare类(MiddlewareMixin):
def process_request(自身,请求):
Print(调用中间件MyMiddleWare.process_request方法)
返回HttpResponse( h2请求被阻止/h2 )我们向主页http://127.0.0.1:8000/:
再次向404测试页http://127.0.0.1:8000/test404/发送请求:
如您所见,当我们设置中间键返回HttpResponse对象时,我们的请求无法到达视图。
现在,我们来补充一个判断。如果用户不登录,访问堆栈(即调用书店应用下的查看函数),页面会自动跳转到登录页面(/userinfo/log in/);如果您已登录,您可以直接访问堆栈:
从django.http导入HttpResponse
从django.http导入HttpResponseRedirect
从django.utils.deprecation导入MiddlewareMixin
进口re
MyMiddleWare类(MiddlewareMixin):
def process_request(自身,请求):
Print(调用中间件MyMiddleWare.process_request方法)
如果re.match(r^/bookstore/,request.path_info) \
和( userinfo 不在request.session中):
返回HttpResponseRedirect(/userinfo/log in )
注意request.path_info可以获取请求的路由信息。
现在,我们在不登录的情况下向主页http://127.0.0.1:8000/发出请求:
我们点击查看所有书籍,可以看到页面跳转到登录页面:
现在,我们登录并返回主页:
单击以查看所有图书:
如您所见,当我们登录时,我们可以访问堆栈。
转载请联系作者获得转载授权,否则将追究法律责任。
郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。