自定义中间件五个方法(部分方法)实例

自定义中间件项目:

  

模板Templates

  login.html

 {% load static %}
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<script src="{% static 'jquery-3.4.1.js' %}"></script>
<script src="{% static 'jquery-cookie-1.4.1.js' %}"></script>
<title>login</title>
</head>
<body>
<div>
用户名:<input type="text" id="username"><br>
密码:<input type="password" id="password"><br>
{% csrf_token %}
<input type="button" id="submit" value="登录">
<span id="warning" style="color: red;"></span>
</div>
</body>
<script>
$(function () {
$('#submit').click(function () { $.ajax({
url:'{% url "login" %}',
type:'post',
headers:{'X-CSRFToken':$.cookie('csrftoken')},
data:{
username:$('#username').val(),
password:$('#password').val(), },
success:function (response) {
if (response.status){
location.href=response.url
}else {
$('#warning').text('账号或密码有误!')
}
}
})
})
})
</script>
</html>

login.html

  index.html

 <!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>index</title>
</head>
<body>
<div>
<h1>这是主页index,欢迎您的登录!</h1>
<a href="{% url 'logout' %}"></a>
</div>
</body>
</html>

index.html

控制器urls.py 

 from django.conf.urls import url
from django.contrib import admin
from app01 import views
urlpatterns = [
url(r'^admin/', admin.site.urls),
url(r'^login/', views.login,name='login'),
url(r'^index/', views.index,name='index'),
url(r'^logout/', views.logout,name='logout'),
]

urls.py

视图views.py

 from django.shortcuts import render,HttpResponse,redirect
from django.urls import reverse
import json
from django.http import JsonResponse # Create your views here. def login(request):
if request.method=='GET':
print('view视图函数')
# raise ValueError #视图函数抛出异常时,才会逆序依次执行中自定义中间件中的process_exception方法
return render(request,'login.html')
elif request.method=='POST':
name=request.POST.get('username')
psd=request.POST.get('password')
if name=='yang' and psd=='':
request.session['status']=True
request.session['name']=name # return HttpResponse(json.dumps({'status':1,'url':reverse('index')}),content_type='application/json')
return JsonResponse({'status':1,'url':reverse('index')})
else:
return JsonResponse({'status':0,'url':''}) def index(request):
return render(request,'index.html') def logout(request):
request.session.flush()#退出同时清空客户端cookie和服务端session
return redirect('login')

views.py

自定义中间件middlewares.py

 #process_request和process_response两个方法最常用

 from django.utils.deprecation import MiddlewareMixin
from django.shortcuts import redirect,HttpResponse
from django.urls import reverse class Middleware1(MiddlewareMixin):
def process_request(self, request):
print('M1_process_request:wsgi.py封装socket和请求对象request之后,url控制器分发之前')
#设置白名单,在url列表中的请求均可不执行该中间件的以下代码,直接绕过登录认证
url = [reverse('login'), ]#请求白名单
if request.path in url:
return None
else:
if request.session.get('status'):
pass
else:
# 在process_request中,返回值只有为None时才会继续执行后边的中间件,否则直接返回当前process_request中return的内容
return redirect('login')
def process_view(self, request, view_func, view_args, view_kwargs):
print('M1_process_view:控制器映射之后,视图函数执行之前')
def process_exception(self, request, exception):
print('M1_process_exception:视图函数中捕获到错误时自动触发该函数')
def process_response(self,request,response):
print('M1_process_response')
# 在process_response中,返回值只有为response对象时,才会接力式返回视图函数的返回结果,否则会被process_response中的return结果覆盖,不写则报错
return HttpResponse('M1_process_response:视图函数执行之后,wsgi.py封装send之前,返回值不是接力原视图函数resopnse对象,而是被覆盖')
# return response class Middleware2(MiddlewareMixin):
def process_request(self, request):
print('M2_process_request:wsgi.py封装socket和请求对象request之后,url控制器分发之前')
#在process_request中,返回值只有为None时才会继续执行后边的中间件,否则直接返回当前process_request中return的内容
# return HttpResponse('M2_process_request返回不是None直接终止处理返回')
def process_view(self, request, view_func, view_args, view_kwargs):
print('M2_process_view:控制器映射之后,视图函数执行之前')
def process_exception(self, request, exception):
print('M2_process_exception:视图函数中捕获到错误时自动触发该函数')
def process_response(self,request,response):
print('M2_process_response')
return HttpResponse('M2_process_response:视图函数执行之后,wsgi.py封装send之前,返回值不是接力原视图函数resopnse对象,而是被覆盖')
# return response

middlewares.py

配置settings.py

settings.py

 执行结果:

后端:

  

    前端:

    

   视图函数抛出异常测试process_exception

    

中间件补充说明

process_template_response(用的比较少)

process_template_response(self, request, response)

它的参数,一个HttpRequest对象,response是TemplateResponse对象(由视图函数或者中间件产生)。

process_template_response是在视图函数执行完成后立即执行,但是它有一个前提条件,那就是视图函数返回的对象有一个render()方法(或者表明该对象是一个TemplateResponse对象或等价方法)。

 #中间件:
class MD1(MiddlewareMixin): def process_request(self, request):
print("MD1里面的 process_request") def process_response(self, request, response):
print("MD1里面的 process_response")
return response def process_view(self, request, view_func, view_args, view_kwargs):
print("-" * 80)
print("MD1 中的process_view")
print(view_func, view_func.__name__) def process_exception(self, request, exception):
print(exception)
print("MD1 中的process_exception")
return HttpResponse(str(exception)) def process_template_response(self, request, response):
print("MD1 中的process_template_response")
return response class MD2(MiddlewareMixin):
def process_request(self, request):
print("MD2里面的 process_request")
pass def process_response(self, request, response):
print("MD2里面的 process_response")
return response def process_view(self, request, view_func, view_args, view_kwargs):
print("-" * 80)
print("MD2 中的process_view")
print(view_func, view_func.__name__) def process_exception(self, request, exception):
print(exception)
print("MD2 中的process_exception") def process_template_response(self, request, response):
print("MD2 中的process_template_response")
return response views.py视图:
def index(request):
print("app01 中的 index视图")
#raise ValueError('出错啦')
def render():
print("in index/render")
#raise ValueError('出错啦') #至于render函数中报错了,那么会先执行process_template_response方法,然后执行process_exception方法,如果是在render方法外面报错了,那么就不会执行这个process_template_response方法了。
return HttpResponse("O98K") #返回的将是这个新的对象
rep = HttpResponse("OK")
rep.render = render
return rep 访问index视图,终端输出的结果:
MD2里面的 process_request
MD1里面的 process_request
--------------------------------------------------------------------------------
MD2 中的process_view
<function index at 0x000001C111B97488> index
--------------------------------------------------------------------------------
MD1 中的process_view
<function index at 0x000001C111B97488> index
app01 中的 index视图
MD2 中的process_template_response
MD1 中的process_template_response
in index/render
MD1里面的 process_response
MD2里面的 process_response

补充

 

最新文章

  1. ASP.NET MVC中的模型装配 封装方法 非常好用
  2. ASP.NET中使用DropDownList实现无刷新二级联动详细过程
  3. 关于nodejs4.0 npm乱码以及离线全局安装时要注意的问题
  4. linux 配置java环境变量
  5. 判断数组(array)中是否包含某个字符(contains)
  6. nyoj 95 众数问题【水】
  7. 在Windows 下为PHP5.4安装PEAR, PHPUnit , phpDoc2
  8. 网页 cookie
  9. wget实例
  10. Optimizing Item Import Performance in Oracle Product Hub/Inventory
  11. Cookie的存活时间
  12. Shiro简介及入门(四)
  13. 浅谈常用的设计模式(new)
  14. MySQL JOIN操作报错问题小解
  15. 常用Mysql存储引擎--InnoDB和MyISAM简单总结
  16. Java学习网址
  17. [NCH 1, 3]
  18. Kafka安装之二 在CentOS 7上安装Kafka
  19. Mysql -- 设置中国时区时间
  20. lucene 学习一

热门文章

  1. foreach 里少用&amp;$v
  2. 部署企业LNMP架构搭建bbs
  3. 12.Python提供了哪些内建类型
  4. Jenkins+Jmeter+Ant   生成测试报告
  5. MySQL - Show Global Status 整理
  6. CSS3轻松实现彩色旋转六面体动画
  7. Codeforce-CodeCraft-20 (Div. 2)-C. Primitive Primes(本原多项式+数学推导)
  8. OSG程序设计之Hello World 2.0
  9. JavaWeb----Servler
  10. 201771010113 李婷华 《面向对象程序设计(Java)》第八周总结