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

 

 

 


推荐阅读
  • 本文介绍了django中视图函数的使用方法,包括如何接收Web请求并返回Web响应,以及如何处理GET请求和POST请求。同时还介绍了urls.py和views.py文件的配置方式。 ... [详细]
  • 本文介绍了机器学习手册中关于日期和时区操作的重要性以及其在实际应用中的作用。文章以一个故事为背景,描述了学童们面对老先生的教导时的反应,以及上官如在这个过程中的表现。同时,文章也提到了顾慎为对上官如的恨意以及他们之间的矛盾源于早年的结局。最后,文章强调了日期和时区操作在机器学习中的重要性,并指出了其在实际应用中的作用和意义。 ... [详细]
  • 一:跨域问题1、同源策略(浏览器的安全策略)    只允许当前页面朝当前域下发请求,如果向其他域发请求,请求可以正常发送,数据也可以拿回,但是被浏览器拦截了  2、c ... [详细]
  • 关键词:Golang, Cookie, 跟踪位置, net/http/cookiejar, package main, golang.org/x/net/publicsuffix, io/ioutil, log, net/http, net/http/cookiejar ... [详细]
  • 个人学习使用:谨慎参考1Client类importcom.thoughtworks.gauge.Step;importcom.thoughtworks.gauge.T ... [详细]
  • Python瓦片图下载、合并、绘图、标记的代码示例
    本文提供了Python瓦片图下载、合并、绘图、标记的代码示例,包括下载代码、多线程下载、图像处理等功能。通过参考geoserver,使用PIL、cv2、numpy、gdal、osr等库实现了瓦片图的下载、合并、绘图和标记功能。代码示例详细介绍了各个功能的实现方法,供读者参考使用。 ... [详细]
  • 开发笔记:Java是如何读取和写入浏览器Cookies的
    篇首语:本文由编程笔记#小编为大家整理,主要介绍了Java是如何读取和写入浏览器Cookies的相关的知识,希望对你有一定的参考价值。首先我 ... [详细]
  • 深入理解Kafka服务端请求队列中请求的处理
    本文深入分析了Kafka服务端请求队列中请求的处理过程,详细介绍了请求的封装和放入请求队列的过程,以及处理请求的线程池的创建和容量设置。通过场景分析、图示说明和源码分析,帮助读者更好地理解Kafka服务端的工作原理。 ... [详细]
  • Python SQLAlchemy库的使用方法详解
    本文详细介绍了Python中使用SQLAlchemy库的方法。首先对SQLAlchemy进行了简介,包括其定义、适用的数据库类型等。然后讨论了SQLAlchemy提供的两种主要使用模式,即SQL表达式语言和ORM。针对不同的需求,给出了选择哪种模式的建议。最后,介绍了连接数据库的方法,包括创建SQLAlchemy引擎和执行SQL语句的接口。 ... [详细]
  • MATLAB函数重名问题解决方法及数据导入导出操作详解
    本文介绍了解决MATLAB函数重名的方法,并详细讲解了数据导入和导出的操作。包括使用菜单导入数据、在工作区直接新建变量、粘贴数据到.m文件或.txt文件并用load命令调用、使用save命令导出数据等方法。同时还介绍了使用dlmread函数调用数据的方法。通过本文的内容,读者可以更好地处理MATLAB中的函数重名问题,并掌握数据导入导出的各种操作。 ... [详细]
  • SpringMVC接收请求参数的方式总结
    本文总结了在SpringMVC开发中处理控制器参数的各种方式,包括处理使用@RequestParam注解的参数、MultipartFile类型参数和Simple类型参数的RequestParamMethodArgumentResolver,处理@RequestBody注解的参数的RequestResponseBodyMethodProcessor,以及PathVariableMapMethodArgumentResol等子类。 ... [详细]
  • 本文介绍了一种轻巧方便的工具——集算器,通过使用集算器可以将文本日志变成结构化数据,然后可以使用SQL式查询。集算器利用集算语言的优点,将日志内容结构化为数据表结构,SPL支持直接对结构化的文件进行SQL查询,不再需要安装配置第三方数据库软件。本文还详细介绍了具体的实施过程。 ... [详细]
  • python3 logging
    python3logginghttps:docs.python.org3.5librarylogging.html,先3.5是因为我当前的python版本是3.5之所 ... [详细]
  • Django学习笔记之djangodebugtoolbar使用指南
    介绍django-debug-toolbar是一组可配置的面板,可显示有关当前请求响应的各种调试信息,并在单击时显示有关面板内容的更多详细信息。github地址文档地址安装配置1. ... [详细]
  • 我收到这个错误.我怎么能在我的情况下解决这个问题?Bitmapcannotberesolvedtoatype发生错误的行publicvoidonPageStart ... [详细]
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社区 版权所有