登录成功后的 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
我有一个要求,每当我登录或尝试请求具有 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