web-dev-qa-db-fra.com

Django middleware d'exception: TypeError: object () ne prend aucun paramètre

J'utilise Django 1.10 et tente d'attraper toutes les exceptions avec un middleware d'exception.

Le code ci-dessous provoque une erreur de serveur interne:

mw_instance = middleware(handler)
TypeError: object() takes no parameters

views.py

from Django.http import HttpResponse

def my_view(request):
    x = 1/0 # cause an exception
    return HttpResponse("ok")

settings.py

MIDDLEWARE = [
    'Django.middleware.security.SecurityMiddleware',
    'Django.contrib.sessions.middleware.SessionMiddleware',
    'Django.middleware.common.CommonMiddleware',
    'Django.middleware.csrf.CsrfViewMiddleware',
    'Django.contrib.auth.middleware.AuthenticationMiddleware',
    'Django.contrib.messages.middleware.MessageMiddleware',
    'Django.middleware.clickjacking.XFrameOptionsMiddleware',
    'myproject.middleware.ExceptionMiddleware',  

]

middleware.py

from Django.http import HttpResponse

class ExceptionMiddleware(object):
    def process_exception(self, request, exception): 
        return HttpResponse("in exception")

J'ai vu ces object () ne prend aucun paramètre dans Django 1.1 et d'autres questions sur le middleware versus middleware_classes, mais je ne suis pas sûr de savoir comment cela s'applique à ce cas , ou ce que j’aurais réellement besoin de changer pour résoudre le problème.

47
user984003

Comme vous utilisez les nouveaux paramètres MIDDLEWARE, votre classe middleware doit accepter un fichier get_response argument: https://docs.djangoproject.com/fr/1.10/topics/http/middleware/#writing-your-own-middleware

Vous pourriez écrire votre classe comme ceci:

from Django.http import HttpResponse

class ExceptionMiddleware(object):
    def __init__(self, get_response):
        self.get_response = get_response

    def __call__(self, request):
        return self.get_response(request)

    def process_exception(self, request, exception): 
        return HttpResponse("in exception")

Vous pouvez aussi utiliser MiddlewareMixin pour rendre votre middleware compatible avec les versions antérieures à la 1.10 et post-1.10 Django versions: https://docs.djangoproject.com/ en/1.10/topics/http/middleware/# mise à niveau-pré-Django-1-10-style-middleware

from Django.http import HttpResponse
from Django.utils.deprecation import MiddlewareMixin

class ExceptionMiddleware(MiddlewareMixin):
    def process_exception(self, request, exception):
        return HttpResponse("in exception")
117
Thomas Druez