使用Python Flask将数据从GET请求传递到POST请求

时间:2013-12-24 00:21:09

标签: python flask

I Flask,我正在构建一个以这种方式构建的小型Web应用程序:

@app.route("myGet/")
def myGet():
   mySuperLongString = generateRandomSuperLongString()
   return render_template("myTemplate.html",text=mySuperLongString)

@app.route("myPost/")
def myPost():
   answer = request.form['answer']
   if someCondition(mySuperLongString, answer):
      return "you got it!"
   else:
      return "no, it's wrong"

myTemplate.html包含:

<form method = post class = solution action={{url_for('myPost')}}>
  <dl>
    <dt>
      <text>{{mySuperLongString}}</text>
      <dd><textarea name=answer row=5 col=40></textarea></dd>
      <dd><input type=submit value='your answer'></dd>
    </dt>
  </dl>
</form>

基本上,我不知道函数myPost如何知道mySuperLongString。我尝试在myTemplate.html中通过在<text>字段中添加名称(将<text>替换为<text name=string>)来传递它,但Python不会让我访问它。另外,我不想将mySuperLongString放在与myPost相关联的网址中。

那么,有人知道如何在我的请求之间传递数据吗?

2 个答案:

答案 0 :(得分:1)

您可以使用隐藏的表单变量,例如

<input type="hidden" name="superlongstring" value="{{mySuperLongString}}">

但这是一个坏主意,因为聪明的用户可以查看源代码并将该值修改为他们想要的任何值,这可能会破坏您的代码。

更好的想法是将其附加到用户的会话,并方便地Flask provides such a mechanism。要使用它,请在myGet()添加

flask.session['superlongstring'] = mySuperLongString

myPost()中使用

检索它
mySuperLongString  = flask.session['superlongstring']

答案 1 :(得分:1)

freespace的答案是使用cookies。这是最简单的方法,可能对你有用。但是,它确实有一些微妙的细微差别:

  • 它确实依赖于使用cookie,这可能会破坏表单的无状态。如果用户在两个选项卡中打开表单,然后使用首先打开的选项卡中的表单提交表单,则表单将与第二个生成的“超长字符串”一起发送,而不是第一个。这可能是一个问题,也可能不是。

  • 此外,短暂的Cookie过期(或更可能是禁用Cookie的浏览器)会导致此策略失败。

这两个问题可能不是一个足够大的问题,你需要另一个解决方案,但是如果你这样做,另一种方法是使用<input type="hidden">标签将超长字符串放在表单中。 ..

<form method = post class = solution action={{url_for('myPost')}}>
  <dl>
    <dt>
      <input type="hidden" name="superlongstring" value="{{mySuperLongString}}"></input>
      <dd><textarea name=answer row=5 col=40></textarea></dd>
      <dd><input type=submit value='your answer'></dd>
    </dt>
  </dl>
</form>

正如自由空间已经显示的那样,智能用户无法阻止“superlongstring”的值。如果要阻止这种情况,可以使用类似itsdangerous库的内容来帮助您创建用户可以篡改他们想要的所有字符串,但您的代码可以轻松识别为“篡改”字符串。然后,在服务器端,您可以检查篡改的字符串并按照您的意愿处理它。

请记住,这不会“加密”您的“超长字符串”。聪明的用户将能够确定“超长字符串”的实际值是什么(但同样,他们也可以使用cookie方法执行此操作)。

另外,这正是Flask如何处理从session对象中的值创建Cookie,以便它们不会被轻易篡改。