Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/github/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Django信号和登录重定向的计时问题_Django_Redirect_Login_Signals - Fatal编程技术网

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视图也存在同样的问题

如果我在视图的main
get
方法中添加一个检查,我可能会浪费一些重定向,并最终让用户登录,但这似乎是一个巨大的漏洞:

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个文件之间。这没什么区别。