关于中间件的顺序
中间件放在主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会被下发到前端。