Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/visual-studio-2010/4.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
Python 在Django中使用HttpResponseRedirect时,如何传递模板上下文信息?_Python_Django_Http_Redirect - Fatal编程技术网

Python 在Django中使用HttpResponseRedirect时,如何传递模板上下文信息?

Python 在Django中使用HttpResponseRedirect时,如何传递模板上下文信息?,python,django,http,redirect,Python,Django,Http,Redirect,我有一个表单,在用户输入信息后重定向到同一页面(以便他们可以继续输入信息)。如果表单提交成功,我将返回 HttpResponseRedirect(request.path) 这很好用。但是,在这种情况下,我也希望向用户显示一些消息(例如,屏幕顶部的“您的数据已保存”)。如果我没有重定向,我只会在上下文字典中返回这些消息。然而,有了重定向,我不能这样做 那么,在使用HttpResponseRedirect时,如何传递模板上下文信息呢 我想做的事情似乎非常普遍,所以如果我遗漏了一些明显的东西,请原

我有一个表单,在用户输入信息后重定向到同一页面(以便他们可以继续输入信息)。如果表单提交成功,我将返回

HttpResponseRedirect(request.path)
这很好用。但是,在这种情况下,我也希望向用户显示一些消息(例如,屏幕顶部的“您的数据已保存”)。如果我没有重定向,我只会在上下文字典中返回这些消息。然而,有了重定向,我不能这样做

那么,在使用HttpResponseRedirect时,如何传递模板上下文信息呢


我想做的事情似乎非常普遍,所以如果我遗漏了一些明显的东西,请原谅。

你不能。HttpResponseRedirect向浏览器发送客户端重定向(HTTP状态代码302),然后浏览器重新请求另一个页面


您可以在重定向上设置URL查询字符串,但用户和任何拦截HTTP请求的人(即代理)都可以看到该字符串,因此不适用于敏感信息。

您可以将?saved=1添加到查询字符串中,并使用以下内容进行检查:

saved = request.GET.get('saved', False)

我所知道的通过重定向传递数据的唯一方法是将GET参数添加到正在传递的URL中。为了避免XSS攻击,您需要传递一个特定的常量,如:

[您正在传递的当前路径]?消息=已保存

然后在处理程序中为传入的路径处理message=saved参数


更复杂的方法是不在重定向中传递数据,而是使用类似于存储重定向后显示给用户的基于会话的数据的方法。

最好的方法可能是在重定向URL上使用编码查询字符串。。。这是一种老派的做法

你可以这样做

/第/?页m=1、/page/?页m=2等


然后,您将使用request.GET解析该变量,并在视图代码中显示相应的消息。

如果您使用的是auth,并且有一个已登录的用户,您可以:

GET参数也可以被黑客攻击。其他答案中提到的查询字符串可以使用

我认为最可取的方法是使用会话框架。这样,您就可以在上下文中加载您想要的任何内容并获得

{{ request.session.foo }} 
foo
可以是消息,也可以是:

{% ifequal request.session.foo 1 %} Nice work! {% else %} Almost! {% endifequal %}
还有其他有趣的东西


从views.py您必须在会话中放入一个键/值对,然后从HTML模板中读取它

例如:

视图.py

# your code here
request.session['vote'] = 1
return HttpResponseRedirect(request.path)
from django.contrib import messages

def view(request):
  # your code
  messages.success(request, "Your data has been saved!")
  HttpResponseRedirect(request.path)
your_template.html

{% ifequal request.session.vote 1 %}
    <!-- Your action here -->
{% endifequal  %}
{% if messages %}
<ul class="messages">
  {% for message in messages %}
  <li{% if message.tags %} class="{{ message.tags }}"{% endif %}>{{ message }}</li>
  {% endfor %}
</ul>
{% endif %}
{%ifequal request.session.vote 1%}
{%endifequal%}

为了完成和将来的参考,您现在可以使用。安装后:

视图.py

# your code here
request.session['vote'] = 1
return HttpResponseRedirect(request.path)
from django.contrib import messages

def view(request):
  # your code
  messages.success(request, "Your data has been saved!")
  HttpResponseRedirect(request.path)
template.html

{% ifequal request.session.vote 1 %}
    <!-- Your action here -->
{% endifequal  %}
{% if messages %}
<ul class="messages">
  {% for message in messages %}
  <li{% if message.tags %} class="{{ message.tags }}"{% endif %}>{{ message }}</li>
  {% endfor %}
</ul>
{% endif %}
{%if消息%}
    {消息%中的消息为%s} {{message}} {%endfor%}
{%endif%}
与request.session['foo']=1相同?是,对于第二个模板代码。或者,对于第一个模板片段,您可以根据逻辑将整个消息放在其中。。。谢谢你的建议。我使用了这种方法,而且效果很好。第二个页面的加载似乎是在浏览器发出另一个单独的请求后进行的(第一个响应返回302),因此您不能像使用HttpResponseRedirect那样在视图之间来回传递信息。IMHO,会话框架是在请求之间传递信息的最简单的方法。这是一个古老的答案,但我怀疑类似的东西可以用于我在这里提出的问题:如果你有时间,我很想听听你的想法:-)