Django 重定向到 /accounts/profile

Posted

技术标签:

【中文标题】Django 重定向到 /accounts/profile【英文标题】:Django redirects to /accounts/profile 【发布时间】:2019-01-06 08:58:30 【问题描述】:

我编写了一些中间件来限制对除豁免 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/$'。

【问题讨论】:

您需要出示您的代码。 【参考方案1】:

找到问题所在,它在上面第二个 if 语句的中间件代码中。即

if request.user.is_authenticated() and url_is_exempt:
            return redirect(settings.LOGIN_REDIRECT_URL)

我将“return redirect(settings.LOGIN_REDIRECT_URL)”这一行改为“return None”,问题就解决了。

【讨论】:

以上是关于Django 重定向到 /accounts/profile的主要内容,如果未能解决你的问题,请参考以下文章

Django 1.4 - 重定向到非 HTTP url

django 403 禁止 - 重定向到登录

django:登录后重定向到引用页面[重复]

django 重定向

登录后 Django 重定向到仪表板

Django LogoutView 重定向到上一页