Django信号和登录重定向的时间问题

时间:2015-03-08 22:31:14

标签: 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.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

0 个答案:

没有答案