2013-12-24 64 views
1

我瓶,我建立一個小型Web應用程序POST請求結構那樣:從一個GET請求將數據傳遞到與Python瓶

@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>,<text name=string>)來在myTemplate.html中傳遞它,但Python無法讓我訪問它。此外,我不想將mySuperLongString放入與myPost關聯的網址中。

那麼,有人知道我可以如何在我的請求之間傳遞數據嗎?

回答

1

您可以使用隱藏的表單變量,例如,

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

但是,這是一個壞主意,因爲一個聰明的用戶能夠查看源代碼,並修改該值爲所欲爲,可能破壞你的代碼。

一個更好的主意是將它附加到用戶的會話,並方便地Flask provides such a mechanism。要使用它,在myGet()添加

flask.session['superlongstring'] = mySuperLongString 

myPost()檢索使用它

mySuperLongString = flask.session['superlongstring'] 
+0

謝謝!我很驚訝沒有更直接的方法來解決這類問題(我必須在使用'flask.session'之前將密鑰設置到會話中)。我認爲我的問題將是一個非常普遍的需求。 – S4M

+2

這是非常常見的,使用會話變量是一個相當簡單的:)你必須記住,HTTP設計是無狀態的。一個請求在協議層完全獨立於下一個請求。 – freespace

+0

可以使用燒瓶的會話通過GET/POST請求嗎? –

1

自由空間的答案是使用Cookie。這是最簡單的方法,並且可能適合你。然而,它確實有一些細微的差別:

  • 它不依賴於使用的cookies,這有可能破壞形式的無國籍。如果用戶在兩個選項卡中打開表單,然後使用首先打開的選項卡中的表單提交表單,則表單將與第二個生成的「超長字符串」一起發送,而不是第一個。這可能是一個問題,或者它可能不是。

  • 此外,短的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以便它們不容易被篡改的問題。

+0

那麼,在我的特殊情況下,'mySuperLongString'是用戶應該看到並相應回答的內容,所以我並不擔心有人會想要竊取它......我會在下一次嘗試時嘗試! – S4M

相關問題