django 403,django笔记

  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的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。

留言与评论(共有 条评论)
   
验证码: