登录成功后的 Django 重定向

Django Redirect after Successful Login

我有一个要求,每当我登录或尝试请求具有 login_decorator 的视图时,下一页就是我需要要求用户 select 业务的页面实体(不考虑请求的原始视图)。

假设页面是 http://127.0.0.1:8999/APP/business_unit

为了实现这一点,我在 settings.py

中配置了以下内容
LOGIN_REDIRECT_URL='/APP/business_unit_selector'

现在当我尝试访问时 http://127.0.0.1:8999/APP/range_list 页面转到 http://127.0.0.1:8999/APP/login?next=/APP/range_list 我原以为登录后的下一页是 /APP/business_unit

但是,下一页是 /APP/range_list

浏览器地址栏有http://127.0.0.1:8999/APP/login?next=/APP/range_list

是否有可能实现我在 Django 中尝试的功能?

登录后 http://127.0.0.1:8999/APP/login?next=/APP/range_list 将您重定向到 range_list 的原因是因为 next= 您覆盖了设置文件 LOGIN_REDIRECT_URL='/APP/business_unit_selector' 中指定的内容.

如果我没理解错的话,您需要用户在登录后选择一个企业实体。

想到的几个解决方案如下:

1.) 不要对登录和业务实体使用单独的表单。而是将它们结合起来。

Username
Password
Business Entity

2.) 如果用户没有业务实体 ResponseRedirect("/APP/business_unit_selector"),您还可以在视图中指定 docs here

LOGIN_REDIRECT_URL仅在未指定next时使用。在您的测试请求中有 next=/APP/range_list - 该地址用于在登录后重定向用户。

可能最简单和最有效的解决方案是制作自己的装饰器,类似于 login_required 如果未选择单位则重定向到 /APP/business_unit_selector&next=<redirect_url>,并与 login_required 一起应用.就重定向数量而言,它不是最有效的解决方案,但非常干净,不会弄乱登录页面。

如果您想实现自然流动,您还必须在 business_unit_selector 视图中处理 next 参数。

你的装饰器应该是这样的

from django.contrib.auth.decorators import login_required
from django.core.urlresolvers import reverse
from django.shortcuts import redirect
from django.utils.http import urlquote
import functools

def business_unit_required(view):
    @login_required  # probably you want to incorporate it here
    @functools.wraps(view)
    def wrapped(request, *args, **kwargs):
        if not 'selected_business_unit' in request.session:
            return redirect('%s?next=%s' % (
                reverse('business_unit_selector'),
                urlquote(request.get_full_path())))
        return view(request, *args, **kwargs)
    return wrapped