簡體   English   中英

使用Python Flask將數據從GET請求傳遞到POST請求

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM