Django 1.10:登录所需的中间件重定向循环

con*_*xyz 3 authentication django django-middleware python-2.7

我正在编写一些中间件来有效地@login_required在所有页面上制作。不幸的是,我得到的结果是重定向循环。

该实现使用带有 1.10 viaMiddlewareMixinprocess_request()hook 的“旧”样式中间件,以在用户未通过身份验证时尝试重定向到登录页面。

首先,我使用默认的 auth urls django.contrib.auth.urls。该文件说:

这将包括以下 URL 模式:^login/$ [name='login']...

# main URLConf urls.py
urlpatterns = [
    url(r'^admin/', admin.site.urls),
    url(r'^', include('django.contrib.auth.urls')),  # https://docs.djangoproject.com/en/1.10/topics/auth/default/#module-django.contrib.auth.views
]
Run Code Online (Sandbox Code Playgroud)

然后是中间件(是的,它已添加到MIDDLEWAREin settings.py):

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

class LoginRequiredMiddleware(MiddlewareMixin):

    def process_request(self, request):
        if not request.user.is_authenticated():
            return HttpResponseRedirect('/login/')
Run Code Online (Sandbox Code Playgroud)

当不包含我的中间件时,登录页面/功能可以正常工作,而包含它会导致每个 url 导致ERR_TOO_MANY_REDIRECTS.

我错过了什么?谢谢。

con*_*xyz 5

哦!我需要检查/login/process_request和忽略它。

这是已实现内容的简化版本。真实版本使用 settings.py和正则表达式来定义登录豁免 url。非常感谢 Ryan Witt关于这种方法的帖子

class LoginRequiredMiddleware(MiddlewareMixin):

    def process_request(self, request):
        if not request.user.is_authenticated():
            path = request.path_info.lstrip('/')
            # If path is not root url ('') and path is not exempt from authentication
            if not path or not any(path != eu for eu in ["/login", "admin"]):
                return HttpResponseRedirect("/login/")
Run Code Online (Sandbox Code Playgroud)