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

时间:2016-11-29 18:58:00

标签: django python-2.7 authentication django-middleware

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

实施正在使用" old"样式中间件,1.10通过MiddlewareMixinprocess_request()挂钩尝试在用户未经过身份验证时重定向到登录页面。

首先,我使用默认的身份验证网址django.contrib.auth.urlsdocs说:

  

这将包括以下网址格式:^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
]

然后是中间件(是的,它已添加到MIDDLEWARE中的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/')

当我的中间件不包含在内时,登录页面/功能正常工作,而包含它的每个网址导致ERR_TOO_MANY_REDIRECTS

我错过了什么?感谢。

1 个答案:

答案 0 :(得分:4)

卫生署!我需要在/login/中检查process_request并忽略它。

这是实施内容的简化版本。真实版本使用settings.py和正则表达式来定义登录免除URL。 Ryan Witt post就此方法给予了很多赞誉。

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