ITPub博客

首页 > 应用开发 > Python > 好程序员Python培训之Django中间件基础用法详解

好程序员Python培训之Django中间件基础用法详解

原创 Python 作者:好程序员 时间:2020-09-30 11:11:53 0 删除 编辑

  好程序员Python 培训之 Django 中间件基础用法详解,首先 django 的中间件可以在视图函数执行前执行,比如登陆验证、日志记录等,下面简单说明一下中间件的基础用法吧。

 

1. django 项目文件夹下创建一个用于存放中间件函数的文件夹

 

文件夹的名字可自定义,本文使用utils 作为文件夹名

 

2. utils 文件夹中创建中间件 py 文件

 

如用于登陆验证的中间件loginCheck.py

 

from django.http import HttpResponseRedirect

from django.utils.deprecation import MiddlewareMixin

 

class UserLoginCheck(MiddlewareMixin):

  '''

   登录验证中间件

  '''

  def process_request(self, request):

    # 用户 request 请求前

    path = ['/login/', '/logout/'] # 不需要进行登录检测的 url

    if request.path in path:

      return

 

    userinfoSession = request.session.get('userinfo')

    if not userinfoSession:

      return HttpResponseRedirect('/login/')

    return

 

3. 配置使用中间件

 

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',

  'utils.loginCheck.UserLoginCheck', # 此处为自定义的中间件

]

 

扩展

 

中间件可定义的五种方法

 

Request 预处理函数 :process_request(self,request)

 

这个方法的调用时机在Django 接收到 request 之后,但仍未解析 URL 以确定应当运行的视图函数。 Django 向它传入相应的 Request 对象,以便在方法中修改。

 

如果返回None Django 将继续处理这个 request ,执行后续的中间件,然后调用相应的 view

 

如果返回HttpResponse 对象, Django 将不再执行任何除了 process_response 以外其它的中间件以及相应的 view Django 将立即返回该 HttpResponse

 

View 预处理函数 :process_view(self,request,callback,callback_args,callback_kwargs)

 

这个方法的调用时机在Django 执行完 request 预处理函数并确定待执行的 view (即 callback 参数)之后,但在 view 函数实际执行之前。

 

request HttpRequest 对象。

 

callback Django 将调用的处理 request python 函数 . 这是实际的函数对象本身 , 而不是字符串表述的函数名。

 

args :将传入 view 的位置参数列表,但不包括 request 参数 ( 它通常是传入 view 的第一个参数 )

 

kwargs :将传入 view 的关键字参数字典。

 

process_view() 应当返回 None HttpResponse 对象。如果返回 None Django 将继续处理这个 request ,执行后续的中间件,然后调用相应的 view

 

如果返回HttpResponse 对象, Django 将不再执行任何其它的中间件 ( 不论种类 ) 以及相应的 view Django 将立即返回。

 

Template 模版渲染函数: process_template_response()

 

默认不执行,只有在视图函数的返回结果对象中有render 方法才会执行,并把对象的 render 方法的返回值返回给用户(注意不返回视图函数的 return 的结果了,而是返回视图函数 return 值(对象)中 rende 方法的结果)

 

Exception 后处理函数 :process_exception(self,request,exception)

 

这个方法只有在request 处理过程中出了问题并且 view 函数抛出了一个未捕获的异常时才会被调用。这个钩子可以用来发送错误通知,将现场相关信息输出到日志文件,或者甚至尝试从错误中自动恢复。

 

这个函数的参数除了一贯的request 对象之外,还包括 view 函数抛出的实际的异常对象 exception

 

process_exception() 应当返回 None HttpResponse 对象。

 

如果返回None Django 将用框架内置的异常处理机制继续处理相应 request

 

如果返回HttpResponse 对象, Django 将使用该 response 对象,而短路框架内置的异常处理机制。

 

Response 后处理函数 :process_response(self,request,response)

 

这个方法的调用时机在Django 执行 view 函数并生成 response 之后。

 

该处理器能修改response 的内容;一个常见的用途是内容压缩,如 gzip 所请求的 HTML 页面。

 

这个方法的参数相当直观:request request 对象,而 response 则是从 view 中返回的 response 对象。

 

process_response() 必须返回 HttpResponse 对象 . 这个 response 对象可以是传入函数的那一个原始对象(通常已被修改),也可以是全新生成的。


来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/69913864/viewspace-2725228/,如需转载,请注明出处,否则将追究法律责任。

请登录后发表评论 登录
全部评论

注册时间:2019-03-20

  • 博文量
    330
  • 访问量
    140965