Python 被中间件执行过程弄糊涂了,DJANGO
假设我有一个受Django文档启发的类: 在阅读丹尼尔·卢比奥的《开始Django》一书时,他解释说,执行的顺序是:Python 被中间件执行过程弄糊涂了,DJANGO,python,django,middleware,Python,Django,Middleware,假设我有一个受Django文档启发的类: 在阅读丹尼尔·卢比奥的《开始Django》一书时,他解释说,执行的顺序是: \uuuuu_uuu\uuuu方法已触发(服务器启动时) \uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu 如果声明,process\u view()方法被触发 View方法以调用中的self.get\u response(request)语句开始 “\uuuuuuuuuuuuuu
\uuuuu_uuu\uuuu方法已触发(服务器启动时)
\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu
process\u view()
方法被触发调用中的self.get\u response(request)
语句开始
\uuuuuuuuuuuuuuuuuuuuuuu
方法触发(在每个请求上)”的确切含义是什么?“触发”\uuuuuu调用
方法是否真的会自动触发“self.get\u respone(request)
”,从而调用另一个中间件或类
Django文件指出:
process\u view()
在Django调用视图之前被调用`
对我来说,这意味着Django必须检查'SimpleMiddleware'
类的实例是否包含一个方法'process\u view()'
,然后触发该方法,然后再继续调用\u调用()
方法,该方法“调用视图”?否则,如果立即触发\uuuuuuuuuuuuuuuuu
方法,由于\uuuuuuuu调用方法调用视图(或下一个中间件),“进程视图()
”是否会丢失
有人能帮我理解执行过程吗?Django是怎么做的
谢谢你你把(django 1.10之前的版本)和中间件搞混了。新样式如下所示:
class SimpleMiddleware:
def __init__(self, get_response):
self.get_response = get_response
# One-time configuration and initialization.
def __call__(self, request):
# do stuff with request
response = self.get_response(request)
# do stuff with request and/or response
return response
与之相对应的旧风格是:
class SimpleMiddleware:
def process_request(self, request):
# do stuff with request
def process_response(self, request, response):
# do stuff with request and/or response
为了更容易地将旧代码移植到新的工作方式中,django添加了():
你现在所要做的就是使用老式的中间件,使它们成为这个mixin的子类。但一般来说,新型中间件本身并不具备或需要过程方法。但例如:
from django.utils.deprecation import MiddlewareMixin
class SimpleMiddleware(MiddlewareMixin):
def process_request(self, request):
# do stuff with request
def process_request(self, request, response):
# do stuff with request and/or response
在两个世界都适用。你读过吗?这里解释得很好。是的,这确实是一个很好的资源。我可以假设他们的语句“process_view()在Django调用视图之前被调用”意味着process_view方法在“process_调用”之前运行吗?但是process_view()和其他一些钩子一起包含在新样式的中间件中?至少从文档中可以看出:
class MiddlewareMixin:
def __init__(self, get_response=None):
self.get_response = get_response
super().__init__()
def __call__(self, request):
response = None
if hasattr(self, 'process_request'):
response = self.process_request(request)
response = response or self.get_response(request)
if hasattr(self, 'process_response'):
response = self.process_response(request, response)
return response
from django.utils.deprecation import MiddlewareMixin
class SimpleMiddleware(MiddlewareMixin):
def process_request(self, request):
# do stuff with request
def process_request(self, request, response):
# do stuff with request and/or response