11

我的问题涉及从模板传递变量以在 Django 中查看。

我知道在 URL 中和通过表单传递变量。我遇到的第一个问题是 url 可以被操纵,这不是我想要的。有没有办法阻止这种情况?

现在这就是我作为创可贴的东西:

<form action="/match/" method="post">
{% csrf_token %}

<input type="hidden" name="name1" value="{{ male_results }}">
<input type="hidden" name="userid1" value="{{ male_pic_userid }}">

<input type="hidden" name="name2" value="{{ female_results }}">
<input type="hidden" name="userid2" value="{{ female_pic_userid }}">

<input type="submit" value="Submit" />
</form> 

有没有办法避免不得不使用它?谢谢!

4

2 回答 2

25

大致有 3 种方法可以保留此类信息:

会话(我对您的情况的建议)

只需将您想要的数据塞入request.session字典即可;它将按用户保留,您可以轻松访问它:

# view1
request.session['name1'] = male_results
request.session['userid1'] = male_pic_userid

# view2 (or elsewhere in view1)
male_results = request.session.get('name1')
male_pic_userid = request.session.get('userid1')

好处

  • 无需更改您的模板(除了删除您现在不需要的表格)。
  • 清理网址
  • 即使通过关闭和重新打开浏览器窗口仍然存在
  • 您无需担心用户修改甚至查看会话数据(这样更安全)

缺点

  • 与 一样POST,页面内容由 URL会话数据决定 — URL 不再是唯一的,用户无法共享依赖于会话信息的特定页面

查询参数

类似的东西/match/?name1=foo1&userid1&name2=bar&userid2=2。您可以手动添加这些 ( <a href='/match/?name1={{ male_results }}...) 或将POST表单更改为GET.

好处

  • 这些 URL 可以共享和添加书签;如果它是一个带有过滤选项的列表,这可能是可取的(“这是我喜欢的汽车列表”发布到 Facebook

缺点

  • 正如您已经注意到的,这些可以由用户自由修改
  • 将这些添加到每个 URL 是一个巨大的痛苦

POST 表单(您当前的方法)

好处

  • 更隐蔽(没有某种浏览器扩展,用户不可见)
  • 稍微难以操作(尽管不要依赖这种隐蔽的安全性)
  • 更清洁的网址

缺点

  • 如果您使用浏览器的“返回”按钮,则会在 Internet Explorer 上显示“此页面已过期”消息...
  • ...如果用户尝试重新加载您的任何页面,大多数浏览器上的“您确定要重新发送此数据”消息
  • 如果用户重新打开页面(例如,在 URL 栏中按“返回”),所有这些状态信息都将丢失
  • 用户无法分享他们正在查看的确切页面;内容部分由用户不可见的信息决定
  • POST向每个导航操作添加数据是一个巨大的痛苦。
于 2012-08-23T18:06:37.457 回答
2

将数据从 html 页面获取到服务器后端有三种方法:URL (GET)、表单 (POST) 和 Cookie。

这三个中的任何一个都可能被操纵,因此无论如何您都需要每次都验证服务器上的所有内容。

在效率方面,根据您的帖子标题,URL (GET) 变量的效率稍高一些,因为表单数据在发送到服务器之前会经过少量编码。

在正常使用情况下,标准是当您从服务器检索数据时使用 URL (GET) 变量,当您想要在服务器上操作(编辑/删除)数据时使用表单 (POST) 变量。

于 2012-08-23T18:06:17.133 回答