Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/310.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/21.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python Django中间件_Python_Django - Fatal编程技术网

Python Django中间件

Python Django中间件,python,django,Python,Django,我该怎么办,我的网站的整个URL只供注册用户使用。 我使用中间件,但这个类不起作用 我使用Django==2.1.4 class MyAuthorization: def __init__(self, get_response): self.get_response = get_response def __call__(self, request): response = self.get_response(request)

我该怎么办,我的网站的整个URL只供注册用户使用。 我使用中间件,但这个类不起作用

我使用Django==2.1.4

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

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

        # Code to be executed for each request/response after
        # the view is called.

        return response

    def process_request(request):
        if not request.user.is_authenticated():
            return HttpResponseRedirect('/')  # or http response
        return None
设置.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',
 'myapp.middleware.MyAuthorization',

]

中间件类中的
process\u request
方法永远不会被调用-Django中没有任何东西可以调用这种方法。在调用
get\u response()
之前,您需要在
\u call\u
方法本身中执行该逻辑,如下所示:

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

    def __call__(self, request):
        if not request.user.is_authenticated:  # Note, this is a property, not a method
            if not request.path == '/':
                return HttpResponseRedirect('/')

        response = self.get_response(request)
        return response

注意第二条
if
语句-
if not request.path='/'
-这是为了确保不会得到无限重定向。您可能需要使用类似的逻辑将您的登录视图从该检查中排除,否则注销的用户将永远无法访问它。

正如@solarismoke所述,您应该使用
\uuuu call\uuuu
而不是
process\u request

def __call__(self, request):
    if not request.user.is_authenticated():
        return HttpResponseRedirect('/')
此外,如果用户未通过身份验证,您只是重定向到“/”,这可能会给人一种什么也没有发生的印象


也许您应该重定向到您的登录视图。

您可以发布中间件的订单吗?您的自定义中间件是在django.contrib.auth.middleware.AuthenticationMiddleware之后吗?另外,您的自定义中间件有哪些“不起作用”。您是否收到错误消息?我在列表末尾发布了中间件=['django.middleware.security.SecurityMiddleware','django.contrib.sessions.middleware.SessionMiddleware','django.middleware.common.CommonMiddleware','django.middleware.csrf.CsrfViewMiddleware','django.contrib.messages.middleware.MessageMiddleware','djangoiddleware.clickjacking.xframeoptions中间件“,”myapp.middleware.MyAuthorization“,]好的,请将您的中间件列表也添加到问题的上下文中。如果您将调试
打印(“我在这里”)
处理请求
函数中的语句,它是否打印到您的服务器控制台?我尝试过这样做,但不起作用,它会持续重定向。您需要从检查中排除登录/主页URL。我已更新了答案,以说明如何从检查中排除特定URL。