django - Django 重定向到 /accounts/profile
问题描述
我编写了一些中间件,限制对除豁免 URL 之外的所有 URL 的访问。用户只有登录后才能访问所有 URL,如果未登录,用户只能访问豁免 URL。当用户登录然后尝试访问豁免 URL 之一时,即发生重定向(即重定向到 /accounts/profile)时,问题就出现了。我怎么解决这个问题?
我的中间件
from django.conf import settings
from django.urls import reverse
from django.shortcuts import redirect
from django.contrib.auth import logout
import re
EXEMPT_URLS = [re.compile(settings.LOGIN_URL.lstrip('/'))]
if hasattr(settings, 'LOGIN_EXEMPT_URLS'):
EXEMPT_URLS += [re.compile(url) for url in settings.LOGIN_EXEMPT_URLS]
class LoginRequiredMiddleware:
def __init__(self, get_response):
self.get_response = get_response
def __call__(self, request):
response = self.get_response(request)
return response
def process_view(self, request, view_func, view_args, view_kwargs):
assert hasattr(request, 'user')
path = request.path_info.lstrip('/')
url_is_exempt = any(url.match(path) for url in EXEMPT_URLS)
if path == reverse('logout_success').lstrip('/'):
logout(request)
if request.user.is_authenticated() and url_is_exempt:
return redirect(settings.LOGIN_REDIRECT_URL)
elif request.user.is_authenticated() or url_is_exempt:
return None
else:
return redirect(settings.LOGIN_URL)
设置文件中的豁免 URL。
LOGIN_URL = '/user_account/login/'
LOGIN_EXEMPT_URLS = (
r'^$',
r'^tenders/',
r'^pricing/',
r'^articles/',
r'^contact_us/',
r'^user_account/logout_success/$',
r'^user_account/subscribe/$',
r'^user_account/auth/$',
r'^user_account/password_reset/$',
r'^user_account/reset/(?P<uidb64>[0-9A-Za-z_\-]+)/(?P<token>[0-9A-Za-z]{1,13}-[0-9A-Za-z]{1,20})/$',
r'^user_account/subscribe/(?P<billing_cycle>\d)/(?P<pk>\d+)/$',
r'^user_account/password_reset/done/$',
r'^user_account/reset/done/$',
r'^user_account/auto_complete_search/$',
)
用户登录后,我尝试访问 r'^user_account/auto_complete_search/$'。
解决方案
发现问题出在哪里,它在上面第二个 if 语句的中间件代码中。IE
if request.user.is_authenticated() and url_is_exempt:
return redirect(settings.LOGIN_REDIRECT_URL)
我将“return redirect(settings.LOGIN_REDIRECT_URL)”行更改为“return None”,问题就解决了。
推荐阅读
- python - 在python中使用glob匹配字符串中的模式
- gradle - Gradle 加速 - 使用模块方法
- postgresql - 如何查询列中数据的缩写?
- javascript - 如何在这个交叉点观察者内切换元素?
- android - Android:是否可以为自定义视图“公开”子视图属性?
- google-closure-library - 如何在 Parcel 中使用自定义 Blockly 模块?
- regex - 我需要积极的向后看吗?
- windows - 使用包含双引号的密码提取存档
- curl - 如何使用 facebook API 来限制直播视频的观众?
- azure - 无法登录 Azure 门户