Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/319.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 被中间件执行过程弄糊涂了,DJANGO_Python_Django_Middleware - Fatal编程技术网

Python 被中间件执行过程弄糊涂了,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

假设我有一个受Django文档启发的类:

在阅读丹尼尔·卢比奥的《开始Django》一书时,他解释说,执行的顺序是:

  • \uuuuu_uuu\uuuu方法已触发(服务器启动时)
  • \uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu
  • 如果声明,
    process\u view()
    方法被触发
  • 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