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.
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")