您的位置:首页 > 编程语言 > Go语言

django-中间件

2018-01-29 20:13 225 查看
创建中间件

执行流程

补充
process_request,process_respons

process_view

process_view参数callback

process_exception

创建中间件

在settings.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',
'middleware.auth.AuthMiddleware',
'middleware.auth.AuthMiddleware1',

]


在项目的根目录下创建如下文件夹,py文件



auth.py

from django.utils.deprecation import MiddlewareMixin
from django.shortcuts import HttpResponse, redirect

class AuthMiddleware(MiddlewareMixin):
def process_request(self, request):
# 如果么有返回值;返回None,表示可以继续往下执行
# 如果有返回值,执行自己的response以及以上的response。
print("AuthMiddleware request")
if request.path_info == '/login/':
print("登陆页面")
return None
print("非登陆页面")

user_info = request.session.get('user_info')
if not user_info:
print("未登陆~~")
return redirect('/login/')
print("已登陆~~")

def process_response(self, request, response):
print("AuthMiddleware response")
return response

class AuthMiddleware1(MiddlewareMixin):
def process_request(self, request):
print("AuthMiddleware1 request")

def process_response(self, request, response):
print("AuthMiddleware1 response")
return response


views视图函数如下:

from django.shortcuts import render, redirect, HttpResponse

def login(request):
if request.method == "GET":
print("login get 函数")
return render(request, "login.html")
else:
print("login post 函数")
request.session["user"] = {"id": 1, "name": "safly"}
return redirect("/index")

def index(request):
print("index函数")
return HttpResponse("首页~~")


执行流程

浏览器输入 http://127.0.0.1:8000/login/

浏览器输出如下:

AuthMiddleware request
登陆页面
AuthMiddleware1 request
login get 函数
AuthMiddleware1 response
AuthMiddleware response


浏览器输入 http://127.0.0.1:8000/index/

浏览器输出如下:

AuthMiddleware request
未登陆~~
AuthMiddleware response
AuthMiddleware request
登陆页面
AuthMiddleware1 request
login get 函数
AuthMiddleware1 response
AuthMiddleware response


在登陆login页面http://127.0.0.1:8000/login/

点击提交看执行流行如下:

AuthMiddleware request
登陆页面
AuthMiddleware1 request
login post 函数
AuthMiddleware1 response
AuthMiddleware response

AuthMiddleware request
已登陆~~
AuthMiddleware1 request

index函数
AuthMiddleware1 response
AuthMiddleware response


登陆后输入url http://127.0.0.1:8000/index/

执行流程如下:

AuthMiddleware request
已登陆~~
AuthMiddleware1 request
index函数
AuthMiddleware1 response
AuthMiddleware response


补充

process_request,process_respons

def index(request):

print("view函数...")
return HttpResponse("OK")


from django.utils.deprecation import MiddlewareMixin
from django.shortcuts import HttpResponse

class Md1(MiddlewareMixin):

def process_request(self,request):
print("Md1请求")

def process_response(self,request,response):
print("Md1返回")
return response

class Md2(MiddlewareMixin):

def process_request(self,request):
print("Md2请求")
#return HttpResponse("Md2中断")
def process_response(self,request,response):
print("Md2返回")
return response


结果:

Md1请求
Md2请求
view函数...
Md2返回
Md1返回

注意:如果当请求到达请求2的时候直接不符合条件返回,即return HttpResponse("Md2中断"),程序将把请求直接发给中间件2返回,然后依次返回到请求者,结果如下:

返回Md2中断的页面,后台打印如下:

Md1请求
Md2请求
Md2返回
Md1返回


process_view

继续看示例

from django.utils.deprecation import MiddlewareMixin
from django.shortcuts import HttpResponse

class Md1(MiddlewareMixin):

def process_request(self,request):
print("Md1请求")
#return HttpResponse("Md1中断")
def process_response(self,request,response):
print("Md1返回")
return response

def process_view(self, request, callback, callback_args, callback_kwargs):
print("Md1view")

class Md2(MiddlewareMixin):

def process_request(self,request):
print("Md2请求")
return HttpResponse("Md2中断")
def process_response(self,request,response):
print("Md2返回")
return response

def process_view(self, request, callback, callback_args, callback_kwargs):
print("Md2view")


结果如下:

Md1请求
Md2请求
Md2返回
Md1返回




当最后一个中间的process_request到达路由关系映射之后,返回到中间件1的process_view,然后依次往下,到达views函数,最后通过process_response依次返回到达用户。

注意:process_view如果有返回值,会越过其他的process_view以及视图函数,但是所有的process_response都还会执行

class Md1(MiddlewareMixin):

def process_request(self,request):
print("Md1请求")
#return HttpResponse("Md1中断")
def process_response(self,request,response):
print("Md1返回")
return response

def process_view(self, request, callback, callback_args, callback_kwargs):
print("Md1view")

class Md2(MiddlewareMixin):

def process_request(self,request):
print("Md2请求")
# return HttpResponse("Md2中断")
def process_response(self,request,response):
print("Md2返回")
return response

def process_view(self, request, callback, callback_args, callback_kwargs):
print("Md2view")


Md1请求
Md2请求
Md1view
Md2view
~~~views~~~
Md2返回
Md1返回


process_view参数callback

class Md1(MiddlewareMixin):

def process_request(self,request):
print("Md1请求")
#return HttpResponse("Md1中断")
def process_response(self,request,response):
print("Md1返回")
return response

def process_view(self, request, callback, callback_args, callback_kwargs):
print("Md1view")
response = callback(request, *callback_args, **callback_kwargs)
return response

class Md2(MiddlewareMixin):

def process_request(self,request):
print("Md2请求")
def process_response(self,request,response):
print("Md2返回")
return response

def process_view(self, request, callback, callback_args, callback_kwargs):
print("Md2view")


输出如下:

Md1请求
Md2请求
Md1view
view函数...
Md2返回
Md1返回


process_exception

class Md1(MiddlewareMixin):

def process_request(self,request):
print("Md1请求")
#return HttpResponse("Md1中断")
def process_response(self,request,response):
print("Md1返回")
return response

def process_view(self, request, callback, callback_args, callback_kwargs):

print("md1 process_view...")

def process_exception(self,request,exception):
print("md1 process_exception...")

class Md2(MiddlewareMixin):

def process_request(self,request):
print("Md2请求")
def process_response(self,request,response):
print("Md2返回")
return response
def process_view(self, request, callback, callback_args, callback_kwargs):
print("md2 process_view...")

def process_exception(self,request,exception):
print("md2 process_exception...")


输出如下:

Md1请求
Md2请求
md1 process_view...
md2 process_view...
view函数...

Md2返回
Md1返回


将md2的process_exception修改如下

def process_exception(self,request,exception):
print("md2 process_exception...")
return  HttpResponse("error")


输出如下:

[02/Mar/2018 21:33:50] "GET /middle/ HTTP/1.1" 200 5
Md1请求
Md2请求
md1 process_view...
md2 process_view...
~~~views~~~
md2 process_exception...
Md2返回
Md1返回




内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: