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
相关联的网址中。
那么,有人知道如何在我的请求之间传递数据吗?
答案 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,以便它们不会被轻易篡改。