热门标签 | 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会被下发到前端。

 

 

 


推荐阅读
  • 优化ListView性能
    本文深入探讨了如何通过多种技术手段优化ListView的性能,包括视图复用、ViewHolder模式、分批加载数据、图片优化及内存管理等。这些方法能够显著提升应用的响应速度和用户体验。 ... [详细]
  • 本文探讨了在Django项目中,如何在对象详情页面添加前后导航链接,以提升用户体验。文章详细描述了遇到的问题及解决方案。 ... [详细]
  • 优化SQL Server批量数据插入存储过程的实现
    本文介绍了一种改进的SQL Server存储过程,用于生成批量插入语句。该方法不仅提高了性能,还支持单行和多行模式,适用于SQL Server 2005及以上版本。 ... [详细]
  • Django 使用slug field时遇到的问题 ... [详细]
  • 本文介绍了如何在Django项目中使用django-crontab库来设置和管理定时任务,包括安装、配置、编写定时任务以及常见问题的解决方案。通过具体实例,帮助开发者快速掌握在Django中实现自动化任务的方法。 ... [详细]
  • Django xAdmin 使用指南(第一部分)
    本文介绍如何在Django项目中集成和使用xAdmin,这是一个增强版的管理界面,提供了比Django默认admin更多的功能。文中详细描述了集成步骤及配置方法。 ... [详细]
  • 1.增加视图函数#Http:127.0.0.1booksdefshow_books(request):booksBookInfo.objects.all()returnrend ... [详细]
  • 主板市盈率、市净率及股息率的自动化抓取
    本文介绍了如何通过Python脚本自动从中国指数有限公司网站抓取主板的市盈率、市净率和股息率等关键财务指标,并将这些数据存储到CSV文件中。涉及的技术包括网页解析、正则表达式以及异常处理。 ... [详细]
  • 本文详细介绍了ASP.NET缓存的基本概念和使用方法,包括输出缓存、数据缓存及其高级特性,如缓存依赖、自定义缓存和缓存配置文件等。通过合理利用这些缓存技术,可以显著提升Web应用程序的性能。 ... [详细]
  • 本文将介绍如何编写一些有趣的VBScript脚本,这些脚本可以在朋友之间进行无害的恶作剧。通过简单的代码示例,帮助您了解VBScript的基本语法和功能。 ... [详细]
  • 本文详细介绍了如何在Linux系统上安装和配置Smokeping,以实现对网络链路质量的实时监控。通过详细的步骤和必要的依赖包安装,确保用户能够顺利完成部署并优化其网络性能监控。 ... [详细]
  • 本文介绍了在使用Visual Studio 2015进行项目开发时,遇到类向导弹出“异常来自 HRESULT:0x8CE0000B”错误的解决方案。通过具体步骤和实践经验,帮助开发者快速排查并解决问题。 ... [详细]
  • 本文详细介绍了Java编程语言中的核心概念和常见面试问题,包括集合类、数据结构、线程处理、Java虚拟机(JVM)、HTTP协议以及Git操作等方面的内容。通过深入分析每个主题,帮助读者更好地理解Java的关键特性和最佳实践。 ... [详细]
  • 本文介绍 SQL Server 的基本概念和操作,涵盖系统数据库、常用数据类型、表的创建及增删改查等基础操作。通过实例帮助读者快速上手 SQL Server 数据库管理。 ... [详细]
  • Python 工具推荐 | PyHubWeekly 第二十一期:提升命令行体验的五大工具
    本期 PyHubWeekly 为大家精选了 GitHub 上五个优秀的 Python 工具,涵盖金融数据可视化、终端美化、国际化支持、图像增强和远程 Shell 环境配置。欢迎关注并参与项目。 ... [详细]
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社区 版权所有