考虑这个简单的登录视图:
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
,好像我从未登录过。经过一番调查,如果我在{{1}之后立即启动了一个IPython会话并在一两秒内退出,登录视图正常工作。
查看login()
的源代码,此函数实际上使用信号来记录用户:
login
我遇到了与信号相似的时序问题。我该如何避免这种情况?我使用自己的user_logged_in.send(sender=user.__class__, request=request, user=user)
,但默认的Django存在同样的问题。
如果我在视图的主LoginView
方法中添加一个检查,我可以浪费一些重定向并最终将用户登录,但这似乎是一个巨大的黑客:
get