成功登录后的 Django 重定向

Posted

技术标签:

【中文标题】成功登录后的 Django 重定向【英文标题】:Django Redirect after Successful Login 【发布时间】:2015-05-18 21:54:46 【问题描述】:

我有一个要求,每当我登录或尝试请求具有 login_decorator 的视图时,下一页是我需要要求用户选择业务实体的页面(与请求的原始视图无关)。

假设页面是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 中尝试的目标?

【问题讨论】:

***.com/questions/4870619/… 【参考方案1】:

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

【讨论】:

【参考方案2】:

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

【讨论】:

感谢您的回复。更正了帖子。当我尝试访问127.0.0.1:8999/APP/range_list 页面转到127.0.0.1:8999/APP/login?next=/APP/range_list 我期待登录后的下一页是/APP/business_unit 你能发布你的视图函数的代码吗?我在想,如果我看到那部分代码,我可以更好地理解发生了什么。

以上是关于成功登录后的 Django 重定向的主要内容,如果未能解决你的问题,请参考以下文章

facebook使用django app成功登录后重定向url

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

登录重定向后的woocommerce

python - Django内置登录视图不重定向到下一个

Django:登录后重定向到上一页

Django 视图链接/重定向最佳实践