热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

Django中间件的编写

关于中间件的顺序中间件放在主settings配置文件中,在MIDDLEWARE的列表当中安装自己配置的中间件,在列表当中不同的中间件的执行顺序为从前往后

关于中间件的顺序


中间件放在主settings配置文件中,在MIDDLEWARE的列表当中安装自己配置的中间件,在列表当中不同的中间件的执行顺序为从前往后执行,放在前面的中间件会被先执行。

在执行中间件方法的时候会先执行第一个中间件的process_request方法,然后再执行第二个中间件的process_request方法,等到出来的时候会先执行第二个中间件的process_response方法,然后再执行第一个中间件的process_response方法


process_request


process_request 只有一个参数,是请求,这个请求的request和视图的request是一模 一样的。但是在process_request当中编写代码可以影响到视图当中的request。

代码示例如下:

from django.utils.deprecation import MiddlewareMixin#中间件父类
from django.shortcuts import render_to_response
from django.http import HttpResponseimport os
import datetime
from FreshShop.settings import BASE_DIRclass MiddlewareTest(MiddlewareMixin):def process_request(self,request):#例:在这个位置可以拦截用户,禁止可疑用户访问username = request.GET.get('username')if username and username == 'sss':return HttpResponse('404')


process_view


process_view 拥有四个参数,分别是request、view_func、view_args和view_kwargs

request :一个httpRequest对象

view_func: django 即将使用的视图函数

view_args :视图函数元组参数

view_kwargs: 视图函数的字典参数

无论是view_args还是view_kwargs都不会包含request

代码示例如下:

from django.utils.deprecation import MiddlewareMixin#中间件父类
from django.shortcuts import render_to_response
from django.http import HttpResponseimport os
import datetime
from FreshShop.settings import BASE_DIRclass MiddlewareTest(MiddlewareMixin):def process_view(self,request,view_func,view_args,view_kwargs):print(view_func) #可以获取到view请求路由对应的视图函数

这个方法可以获取到view请求路由对应的视图函数 ,获取到对应的视图函数之后可以进行其他的操作。

 

下面的代码获取到路由请求的函数方法和参数

对比process_request:process_request 在 process_view之前执行,process_request只接受request对象,process_view接受request对象和视图函数及参数。


process_exception


process_exception中有两个参数,分别是request(请求对象),和exception(错误)。并且process_exception方法只有在视图函数当中发生错误才会执行。

如下视图中发生了错误:

在中间件中打印错误

前端和django中接收到的错误如下:


在process_exception下可以设置方法把错误记录在错误日志中

代码如下:

from django.utils.deprecation import MiddlewareMixin#中间件父类
from django.shortcuts import render_to_response
from django.http import HttpResponseimport os
import datetime
from FreshShop.settings import BASE_DIRclass MiddlewareTest(MiddlewareMixin):def process_exception(self,request,exception):"""例:这个地方可以进行错误记录制作错误日志:param request:视图处理中的请求:param exception::return:"""now = datetime.datetime.now().strftime('%Y-%m-%d %H-%M-%S') #获取出错时间level = 'Error' #错误等级content = str(exception) #避免格式错误,都转成字符串log_result = '%s [%s] %s'%(now,level,content) #上述内容整合file_path = os.path.join(BASE_DIR,'error.log') #将错误日志保存在根目录下with open(file_path,'a') as f:f.write(log_result) #将错误写入文件中


process_template_response


process_template_response方法中有两个参数,request(请求对象)和response(响应对象)。

当前方法只有在视图函数当中返回一个render对象时才会执行。如果被使用,一定要返回一个response对象。

当视图函数当中返回有render对象(或者是其他等价的response对象),该方法只会返回render对象返回的内容。

views.py中的代码如下:

def littlewrite(request):def hello():return HttpResponse('hello world')rep = HttpResponse('I am response') #定义HttpResponserep.render = hello #render接收hello方法,前端界面返回的是hello方法的内容return rep #返回hello方法里的内容

记得返回response,中间件的内容如下:

from django.utils.deprecation import MiddlewareMixin#中间件父类
from django.shortcuts import render_to_response
from django.http import HttpResponseimport os
import datetime
from FreshShop.settings import BASE_DIRclass MiddlewareTest(MiddlewareMixin):def process_template_response(self,request,response):print('process_template_response')return response #记得返回response

前端返回render方法中的内容,效果如下:

后台返回如下:


process_response


process_response方法中有两个参数,request(请求对象)和response(响应对象)。

process_response是中间件执行最后的方法,通常用于对响应内容进行再次处理,但是必须返回一个response对象

from django.utils.deprecation import MiddlewareMixin#中间件父类
from django.shortcuts import render_to_response
from django.http import HttpResponseimport os
import datetime
from FreshShop.settings import BASE_DIRclass MiddlewareTest(MiddlewareMixin):def process_response(self,request,response):response.set_COOKIE('myCOOKIE','meet') #可以在最后进行设置COOKIE等操作return response

可以在最后进行设置COOKIE、session或其他操作。等返回前端的时候COOKIE会被下发到前端。

 

 

 


推荐阅读
  • 本文探讨了领域驱动设计(DDD)的核心概念、应用场景及其实现方式,详细介绍了其在企业级软件开发中的优势和挑战。通过对比事务脚本与领域模型,展示了DDD如何提升系统的可维护性和扩展性。 ... [详细]
  • 本文探讨了在Django项目中,如何在对象详情页面添加前后导航链接,以提升用户体验。文章详细描述了遇到的问题及解决方案。 ... [详细]
  • Django 使用slug field时遇到的问题 ... [详细]
  • Django Token 认证详解与 HTTP 401、403 状态码的区别
    本文详细介绍了如何在 Django 中配置和使用 Token 认证,并解释了 HTTP 401 和 HTTP 403 状态码的区别。通过具体的代码示例,帮助开发者理解认证机制及权限控制。 ... [详细]
  • 日志记录对于软件开发至关重要,特别是在调试和维护阶段。通过日志,开发者能够追踪错误源头并了解系统的运行状态。本文将探讨如何在Django框架中有效配置和使用日志记录功能。 ... [详细]
  • c# – UWP:BrightnessOverride StartOverride逻辑 ... [详细]
  • 本文详细介绍了如何使用 Yii2 的 GridView 组件在列表页面实现数据的直接编辑功能。通过具体的代码示例和步骤,帮助开发者快速掌握这一实用技巧。 ... [详细]
  • PHP 过滤器详解
    本文深入探讨了 PHP 中的过滤器机制,包括常见的 $_SERVER 变量、filter_has_var() 函数、filter_id() 函数、filter_input() 函数及其数组形式、filter_list() 函数以及 filter_var() 和其数组形式。同时,详细介绍了各种过滤器的用途和用法。 ... [详细]
  • 1.增加视图函数#Http:127.0.0.1booksdefshow_books(request):booksBookInfo.objects.all()returnrend ... [详细]
  • 本文介绍如何在Django项目中利用UpdateView更新数据后,根据主键(pk)自动重定向至对应的DetailView页面,实现流畅的用户交互体验。 ... [详细]
  • 主板市盈率、市净率及股息率的自动化抓取
    本文介绍了如何通过Python脚本自动从中国指数有限公司网站抓取主板的市盈率、市净率和股息率等关键财务指标,并将这些数据存储到CSV文件中。涉及的技术包括网页解析、正则表达式以及异常处理。 ... [详细]
  • 本文详细介绍了ASP.NET缓存的基本概念和使用方法,包括输出缓存、数据缓存及其高级特性,如缓存依赖、自定义缓存和缓存配置文件等。通过合理利用这些缓存技术,可以显著提升Web应用程序的性能。 ... [详细]
  • FinOps 与 Serverless 的结合:破解云成本难题
    本文探讨了如何通过 FinOps 实践优化 Serverless 应用的成本管理,提出了首个 Serverless 函数总成本估计模型,并分享了多种有效的成本优化策略。 ... [详细]
  • 本文介绍了ArcXML配置文件的分类及其在不同服务中的应用,详细解释了地图配置文件的结构和功能,包括其在Image Service、Feature Service以及ArcMap Server中的使用方法。 ... [详细]
  • 本文深入探讨了HTTP请求和响应对象的使用,详细介绍了如何通过响应对象向客户端发送数据、处理中文乱码问题以及常见的HTTP状态码。此外,还涵盖了文件下载、请求重定向、请求转发等高级功能。 ... [详细]
author-avatar
小水沉伦
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有