【问题标题】:Django - being able to access page only after HttpResponseRedirectDjango - 只有在 HttpResponseRedirect 之后才能访问页面
【发布时间】:2013-12-11 15:55:46
【问题描述】:

我有一个基于类的视图,我在其中处理表单并在成功提交时重定向用户,如下所示:

views.py

def get(self,request):
    form = self.form_class()
    return render(request, template_name, { 'form' : form })
def post(self, request, *args, **kwargs):
    form = self.form_class(request.POST)
    if form.is_valid():
            ...
        return HttpResponseRedirect(reverse('success'))

return render(request, template_name, { 'form' : form })

urls.py

...
url(r'^submit/success', SubmitView.as_view(), name='success'),
...

可以通过输入success/submit直接访问url。我不在网站上使用任何身份验证,并且希望用户在重定向后只能访问提交/成功页面,这样他们就无法直接访问它。我该怎么做?

【问题讨论】:

    标签: python django redirect


    【解决方案1】:

    如果你使用sessions,你可以这样完成:

    # in the view where form is submitted
    if form.is_valid():
        request.session['form-submitted'] = True
        return HttpResponseRedirect(reverse('success'))
    
    # in the success view
    def get(self, request):
        if not request.session.get('form-submitted', False):
            # handle case where form was not submitted
        else:
            # render the template
    

    【讨论】:

    • 这也适用于多标签/窗口查看吗?
    • 取决于浏览器。如果浏览器为所有打开的窗口/选项卡维护相同的会话,则此方法应该有效。
    • 这看起来是一个可行的解决方案。我会尝试使用会话。谢谢!
    【解决方案2】:

    您可以POST 而不是重定向到“成功”页面。 然后使用if request.method == 'POST': 但请注意,这是安全的,因为标头可能被欺骗。

    我认为最好只从 POST 方法中调用成功视图。

    【讨论】:

    • POST 中调用成功视图不是一个好主意,因为用户随后可以刷新页面,因此一次又一次地重新提交表单,等等...
    • 及其官方推荐的Django实践在表单成功时返回重定向
    • 想过这个,但总的来说这看起来是个坏主意。感谢您的建议
    【解决方案3】:

    你有没有尝试过这样的事情:

    if form.is_valid():
            ...
        return HttpResponseRedirect(SubmitView.as_view())
    

    不确定这是否开箱即用,但通过更多技巧,您可能会得到想要的结果。

    【讨论】:

      【解决方案4】:

      要添加到@miki725 发布的答案,我也会确保您更改

      request.session['form-submitted'] = False

      进入后

      if not request.session.get('form-submitted', False):

      为了防止直接访问页面或在浏览器上使用后退。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-12-26
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-08-29
        • 1970-01-01
        相关资源
        最近更新 更多