【Django 踩坑】中间件 报错: TypeError: object() takes no parameters 可以这样解决

 

使用中间件时,报错 TypeError: object() takes no parameters.

 

原始代码:(实现禁止某些ip的浏览器访问

from django.http import HttpResponse


class BlockedIPSMiddleware(object):
    '''中间件类'''
    EXCLUDE_IPS = ['192.168.43.28']  # 禁止访问的地址列表
    def process_view(self, request, view_func, *view_args, **view_kwargs):
        '''视图函数调用之前会调用'''
        user_ip = request.META['REMOTE_ADDR']
        print(user_ip)
        if user_ip in BlockedIPSMiddleware.EXCLUDE_IPS:   # 运行验证时,启动服务时指明ip,设置ALLOWED_HOSTS = ['*']
            return HttpResponse('

Forbidden

')

在正确注册激活中间件组件的前提下,报错:TypeError: object() takes no parameters.

 

原因:Django版本更新,使用了新的中间件设置,中间件类中必须接收一个get_response参数。见官方文档和例子:编写自己的中间件。

 

解决办法1:像官网的例子一样,在中间件类中定义一个__init__函数和一个__call__函数。接收get_response参数。

from django.http import HttpResponse


class BlockedIPSMiddleware(object):
    '''中间件类'''

    def __init__(self, get_response):
        self.get_response = get_response

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

    EXCLUDE_IPS = ['192.168.43.28']  # 禁止访问的地址列表
    def process_view(self, request, view_func, *view_args, **view_kwargs):
        #...省略

 

 

解决方法2:还可以使用 MiddlewareMixin 使中间件与1.10之前和1.10之后的Django版本兼容: 升级 Django 1.10 之前的中间件

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

class BlockedIPSMiddleware(MiddlewareMixin):
    EXCLUDE_IPS = ['192.168.43.28']  # 禁止访问的地址列表
    def process_view(self, request, view_func, *view_args, **view_kwargs):
        '''视图函数调用之前会调用'''
        user_ip = request.META['REMOTE_ADDR']
        print(user_ip)
        if user_ip in BlockedIPSMiddleware.EXCLUDE_IPS:   # 运行验证时,启动服务时指明ip,设置ALLOWED_HOSTS = ['*']
            return HttpResponse('

Forbidden

')

 

 

 

你可能感兴趣的:(Django,django)