我正在编写一些中间件,以便在所有页面上有效地制作@login_required
。不幸的是,我得到的结果是重定向循环。
实施正在使用" old"样式中间件,1.10通过MiddlewareMixin
和process_request()
挂钩尝试在用户未经过身份验证时重定向到登录页面。
首先,我使用默认的身份验证网址django.contrib.auth.urls
。 docs说:
这将包括以下网址格式:
^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
。
我错过了什么?感谢。
答案 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/")