Django信号和登录重定向的计时问题
考虑这个简单的登录视图:Django信号和登录重定向的计时问题,django,redirect,login,signals,Django,Redirect,Login,Signals,考虑这个简单的登录视图: class LoginView(FormView): form_class = LoginForm template_name = 'login.html' def form_valid(self, form): redirect_to = self.request.GET.get('bounce', '/') if not is_safe_url(url=redirect_to, host=self.requ
class LoginView(FormView):
form_class = LoginForm
template_name = 'login.html'
def form_valid(self, form):
redirect_to = self.request.GET.get('bounce', '/')
if not is_safe_url(url=redirect_to, host=self.request.get_host()):
redirect_to = '/'
user = authenticate(
username=form.cleaned_data['username'],
password=form.cleaned_data['password']
)
login(self.request, user)
return redirect(redirect_to)
通过/login/?bounce=/something
登录后,我被重定向回/login/?bounce=/something
,就好像我从未登录过一样。经过一些调查后,如果我在login()
之后立即启动IPython会话并在一两秒钟内退出,则登录视图工作正常
查看登录的源代码
,此函数实际上使用信号让用户登录:
user_logged_in.send(sender=user.__class__, request=request, user=user)
我遇到过类似的信号计时问题。我如何避免这种情况?我正在使用我自己的LoginView
,但是默认的Django视图也存在同样的问题
如果我在视图的mainget
方法中添加一个检查,我可能会浪费一些重定向,并最终让用户登录,但这似乎是一个巨大的漏洞:
class LoginView(FormView):
form_class = LoginForm
template_name = 'login.html'
def get(self, *args, **kwargs):
if self.request.user.is_authenticated():
redirect_to = self.request.GET.get('bounce', '/')
if not is_safe_url(url=redirect_to, host=self.request.get_host()):
redirect_to = '/'
return redirect(redirect_to)
else:
return super(LoginView, self).get(*args, **kwargs)
def form_valid(self, form):
redirect_to = self.request.GET.get('bounce', '/')
if not is_safe_url(url=redirect_to, host=self.request.get_host()):
redirect_to = '/'
if not self.request.user.is_authenticated():
user = authenticate(
username=form.cleaned_data['username'],
password=form.cleaned_data['password']
)
login(self.request, user)
return redirect(redirect_to)
困惑-你总是被重定向,因为你有一个重定向。用户似乎已经登录,因为login()将执行此操作,然后您将重定向。你是说用户仍然是anon?还有-我想你有理由不在设置中使用LOGIN\u REDIRECT\u URL吗?@professorDante:我被重定向回登录页面,这会再次将我重定向到登录页面,依此类推。经过1到3次之后,我被发送到正确的页面。@professorDante:至于
登录\u重定向\u URL
,我不喜欢将URL路由分散在5个文件之间。这没什么区别。