__init__() 缺少 1 个必需的位置参数:'get_response'

dev*_*fan 2 django

我使用 Django 1.11 并收到此错误

class TenantMiddleware:
    def __init__(self, get_response):
        self.get_response = get_response

    def __call__(self, request):
        set_tenant_schema_for_request(request)
        response = self.get_response(request)
        return response
Run Code Online (Sandbox Code Playgroud)

我试图解决这个问题:

class TenantMiddleware:
    def process_response(self, request, response):
        set_tenant_schema_for_request(request)
        return response
Run Code Online (Sandbox Code Playgroud)

这是使用“新”中间件风格的正确等价物吗?

gac*_*vit 7

您的第一个示例是新型中间件的示例,第二个示例是旧式中间件的示例。如果你仍然想process_response(request, response)在新式中间件中使用django.utils.deprecation.MiddlewareMixin,你应该使用class,作为你的中间件类的父类。

from django.utils.deprecation import MiddlewareMixin

# old-style middleware usage in new versions of django
class TenantMiddleware(MiddlewareMixin):

    def process_response(self, request, response):
        set_tenant_schema_for_request(request)
        return response
Run Code Online (Sandbox Code Playgroud)

如果您使用新型中间件,,,

# new-style middleware usage and explanation
class TenantMiddleware:

    def __init__(self, get_response):
        self.get_response = get_response

    def __call__(self, request):
        # implement process_request(request) logic here
        response = self.get_response(request)
        # implement process_response(request, response) logic here
        return response # returns HttpResponse or subclasses here.
Run Code Online (Sandbox Code Playgroud)

在新型中间件,代码之前self.get_response(request)是一样的process_request(request)和代码后self.get_response(request)是一样的process_response(request, response)

希望,对你有帮助。