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

使用Python将数据从GET请求传递到POST请求,python,flask,Python,Flask,我想,我正在构建一个小型web应用程序,其结构如下: @app.route("myGet/") def myGet(): mySuperLongString = generateRandomSuperLongString() return render_template("myTemplate.html",text=mySuperLongString) @app.route("myPost/") def myPost(): answer = request.form['ans

我想,我正在构建一个小型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>

{{mySuperLongString}}
基本上,我不知道函数
myPost
如何知道
mySuperLongString
。我试图通过在
字段中添加一个名称(将
替换为
)在myTemplate.html中传递它,但Python不允许我访问它。另外,我不想将
mySuperLongString
放在与
myPost
关联的url中


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

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

<input type="hidden" name="superlongstring" value="{{mySuperLongString}}">
myPost()中
使用

mySuperLongString  = flask.session['superlongstring']

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

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

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

这两个问题可能都不足以让您需要另一个解决方案,但如果您需要,另一种方法是使用
标记将超长字符串放入表单中

<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>

正如freespace已经表明的那样,智能用户无法阻止更改“superlongstring”的值。如果要防止这种情况发生,可以使用库之类的工具来帮助您创建一个字符串,用户可以随意篡改该字符串,但您的代码可以很容易地识别为“被篡改”的字符串。然后,在服务器端,您可以检查被篡改的字符串,并根据需要处理它

请记住,这不会“加密”您的“超长字符串”。聪明的用户将能够确定“超长字符串”的实际值是多少(但同样,他们也可以通过cookie方法来确定)


顺便说一句,这正是Flask如何从
会话
对象中的值创建cookie,以便它们不容易被篡改。

谢谢!我感到惊讶的是,对于此类问题没有更直接的解决方法(在能够使用
flask.session
之前,我必须为会话设置密钥)。我认为我的问题是一个非常常见的需求。这是非常常见的,使用会话变量是一个非常简单的问题:)你必须记住HTTP在设计上是无状态的。在协议级别上,一个请求与下一个请求完全独立。flask的会话是否可以在GET/POST请求上使用?在我的特殊情况下,
mySuperLongString
是用户希望看到并相应回答的内容,因此我不担心有人会想要窃取它。。。我会在下一次机会尝试!
<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>