Django exception middleware: TypeError: object() takes no parameters

I'm using Django 1.10 and trying to catch all exceptions with exception middleware.

The code below causes an internal server error:

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

I have seen these object() takes no parameters in django 1.10 and other questions talking about middleware versus middleware_classes, but I'm not sure how that applies to this case, or what I'd actually need to change to fix the issue.

40066 次浏览

Since you are using the new MIDDLEWARE settings, your Middleware class must accept a get_response argument: https://docs.djangoproject.com/en/1.10/topics/http/middleware/#writing-your-own-middleware

You could write your class like this:

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

You could also use the MiddlewareMixin to make your Middleware compatible with pre-1.10 and post-1.10 Django versions: 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("in exception")

in the newer version of Django, the middleware should be written like this

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)