con*_*xyz 3 authentication django django-middleware python-2.7
我正在编写一些中间件来有效地@login_required在所有页面上制作。不幸的是,我得到的结果是重定向循环。
该实现使用带有 1.10 viaMiddlewareMixin和process_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.
我错过了什么?谢谢。
哦!我需要检查/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)