好程序员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博客 ” ,链接:https://blog.itpub.net/69913864/viewspace-2725228/ ,如需转载,请注明出处,否则将追究法律责任。