标签:app ica eth doc turn exception Django项目 自定义中间件 none
是介于request与response处理之间的一道处理过程,相对比较轻量级,并且在全局上改变django的输入与输出。因为改变的是全局,所以需要谨慎实用,用不好会影响到性能。
开Django项目的Settings.py文件,看到下面的MIDDLEWARE配置项,django默认自带的一些中间件
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',
]
中间件可以定义五个方法,分别是:(主要的是process_request和process_response)
process_request有一个参数,就是request,这个request和视图函数中的request是一样的。
它的返回值可以是None也可以是HttpResponse对象。返回值是None的话,按正常流程继续走,交给下一个中间件处理,如果是HttpResponse对象,Django将不执行视图函数,而将相应对象返回给浏览器。
它有两个参数,一个是request,一个是response,request就是上述例子中一样的对象,response是视图函数返回的HttpResponse对象。该方法的返回值也必须是HttpResponse对象。
举例:模拟一个网站,无论访问他的那个地址,都要先登录
在项目中创建一个包,随便起名字,一般都放在一个叫做utils的包里面,表示一个公用的组件,创建一个py文件,随便起名字,内容如下
from django.utils.deprecation import MiddlewareMixin
from django.shortcuts import redirect
class MD1(MiddlewareMixin):
#请求来了自动执行process_request方法
#白名单
white_list = ['/login/']
def process_request(self, request):
print("请求来了")
path = request.path
if path not in self.white_list:
status =request.session.get('is_login')
if not status:
return redirect('/login')
#def process_response(self, request, response):
# print("请求走了")
# return response
在配置文件中设置
'app01.utils.MD1.MD1'
views
from django.shortcuts import render,HttpResponse,redirect
def login(request):
if request.method == 'GET':
return render(request,'login.html')
else:
username = request.POST.get('username')
pwd = request.POST.get('password')
if username == 'chao' and pwd == '123':
request.session['is_login'] = True
#request.session
# 1 生成随机字符串,
return redirect('/index/')
else:
return redirect('/login/')
def index(request):
return HttpResponse(1)
login.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<form action="" method="post">
{% csrf_token %}
用户名: <input type="text" name="username">
密码: <input type="text" name='password'>
<input type="submit">
</form>
</body>
</html>
执行顺序
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_exception(self, request, exception)
该方法两个参数:
一个HttpRequest对象
一个exception是视图函数异常产生的Exception对象。
这个方法只有在视图函数中出现异常了才执行,它返回的值可以是一个None也可以是一个HttpResponse对象。如果是HttpResponse对象,Django将调用模板和中间件中的process_response方法,并返回给浏览器,否则将默认处理异常。如果返回一个None,则交给下一个中间件的process_exception方法来处理异常。它的执行顺序也是按照中间件注册顺序的倒序执行。
标签:app ica eth doc turn exception Django项目 自定义中间件 none
原文地址:https://www.cnblogs.com/zdqc/p/11756119.html