[英]Passing data from a GET request to a POST request with Python Flask
我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
。 我試圖通過在<text>
字段中添加一個名稱(用<text name=string>
替換<text>
在myTemplate.html中傳遞它,但是Python不允許我訪問它。 我也不想將mySuperLongString
放在與myPost
關聯的URL中。
那么,有人知道我如何在請求之間傳遞數據嗎?
您可以使用隱藏的表單變量,例如
<input type="hidden" name="superlongstring" value="{{mySuperLongString}}">
但這是一個壞主意,因為聰明的用戶可以查看源並將其修改為所需的值,這有可能破壞您的代碼。
更好的主意是將其附加到用戶的會話中,並且Flask方便地提供了這種機制 。 要使用它,在myGet()
添加
flask.session['superlongstring'] = mySuperLongString
在myPost()
使用
mySuperLongString = flask.session['superlongstring']
freespace的答案是使用cookie。 這是最簡單的方法,可能對您有用。 但是,它確實有一些細微差別:
它確實依賴使用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的方式,因此它們不容易被篡改。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.