dev fan
dev fan

Reputation: 129

__init__() missing 1 required positional argument: 'get_response'

I use Django 1.11 and got this error

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

I tried to fix that:

class TenantMiddleware:
    def process_response(self, request, response):
        set_tenant_schema_for_request(request)
        return response

is this a correct equivalent using "new" middleware style?

Upvotes: 2

Views: 2331

Answers (1)

gachdavit
gachdavit

Reputation: 1261

Your first example is example of new-style middleware, and second one is example of old-style middlewares. If you still want to use process_response(request, response) in new-style middlewares you should use django.utils.deprecation.MiddlewareMixin class, as a parent class of your middleware 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

If you use new-style middlewares,,,

# 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.

In new-style middlewares, code before self.get_response(request) is same as process_request(request) and code after self.get_response(request) is same as process_response(request, response).

Hope, it helps you.

Upvotes: 7

Related Questions