71 votes

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

Je suis en train d'utiliser Django 1.10 et j'essaie d'attraper toutes les exceptions avec un middleware d'exception.

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

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

views.py

from django.http import HttpResponse

def my_view(request):
    x = 1/0 # provoque une 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() takes no parameters in django 1.10 et d'autres questions parlant du middleware versus middleware_classes, mais je ne suis pas sûr de savoir comment cela s'applique à ce cas, ou ce que je devrais réellement modifier pour résoudre le problème.

170voto

Thomas Druez Points 29

Étant donné que vous utilisez les nouveaux paramètres de MIDDLEWARE, votre classe Middleware doit accepter un argument get_response : https://docs.djangoproject.com/en/1.10/topics/http/middleware/#writing-your-own-middleware

Vous pourriez écrire votre classe de cette manière :

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("dans l'exception")

Vous pourriez également utiliser le MiddlewareMixin pour rendre votre Middleware compatible avec les versions antérieures et postérieures à Django 1.10 : https://docs.djangoproject.com/en/1.10/topics/http/middleware/#upgrading-pre-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("dans l'exception")

4 votes

Utiliser MiddlewareMixin a résolu mon problème.

0 votes

MiddlewareMixin dans Django1.11 ne pourra pas déterminer request.user. Il renvoie anonyme

0 votes

À quel point le commentaire de @Sarit est-il vrai et quelle est la solution?

8voto

sajjad Points 111

Dans la nouvelle version de Django, le middleware doit être écrit comme ceci

import datetime
from django.core.cache import cache
from django.conf import settings
from django.utils.deprecation import MiddlewareMixin

class ActiveUserMiddleware(MiddlewareMixin):

    def process_request(self, request):
        current_user = request.user
        if request.user.is_authenticated:
            now = datetime.datetime.now()
            cache.set('seen_%s' % (current_user.username), now, 
                           settings.USER_LASTSEEN_TIMEOUT)

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X