簡體   English   中英

Flask request.form 包含數據但 request.data 為空並且 request.get_json() 返回錯誤

[英]Flask request.form contains data but request.data is empty and request.get_json() returns error

我正在嘗試使用嵌套字典“動態”創建一個數據輸入表單(目前,我使用的是一個具有 3 個值的數組,但將來數組中的元素數量可能會有所不同)。 這似乎工作正常,並且表單“正確”呈現了 html 模板(正確 = 我看到了我希望看到的表單,其中包含 4 列數組中每個元素的 3 行)。

問題是當我通過瀏覽器在表單中輸入數據並單擊“保存數據”按鈕時。 那時我想獲取用戶在表單中輸入的數據並對其進行處理(進行計算、保存等)。

獲取請求數據似乎是一個相當簡單的任務時,表格沒有嵌套字段(基於所有的例子,我所看到的),但對我來說這是推動我堅果。

到目前為止,我看到用戶提交的數據的唯一方法是使用“request.form”,但這是一個 MultiDict 對象並且沒有結構。 對我來說奇怪的部分是 request.data 返回一個空字符串並且 request.get_json() 給出一個錯誤(“無法解碼 JSON”)

具體問題是:如果我想獲取json或字典格式的表單數據(我定義的結構),我做錯了什么? 我還應該在我的代碼中包含什么。 否則,如果這種行為是預期的並且我所能得到的只是一個 MultiDict,那么將數據重建為 json 對象的最佳方法是什么?

這是我的 view.py 代碼: GET 方法首先“動態”創建表單結構並呈現 report.htlm 模板。 POST 方法應該檢查用戶單擊了哪個表單按鈕,並獲取用戶輸入的數據並對其進行處理。 請注意,目前我只有“打印”語句來查看我得到了什么。

@app.route('/report', methods=['GET', 'POST'])
  def report():
   if request.method == 'POST':

     if request.form['submit'] == 'Save Data':
        print (request.form)
        print(request.get_json(force=True)
        print (request.data)
        return redirect(url_for('report'))

    elif request.form['submit'] == 'View Data':

      return redirect(url_for('report'))

   elif request.method == 'GET':
     jsonForm = populate_Form()
     form = ProductionReport.from_json(jsonForm)
     return render_template('report.html',
                          title='Report',
                          form=form)


 def populate_Form():
   j = {"line_production": []}
   lines = ["Standard","Sport","Luxury"]
   for l in lines:
        j["line_production"].append(
          {"line": l, "sku": "", "qty": "", "price": ""})
   return j

這些是我的表格:

from flask.ext.wtf import Form
from wtforms import StringField, BooleanField, IntegerField, FieldList,   FormField, FloatField
from wtforms.validators import DataRequired
import wtforms_json

wtforms_json.init()

class LineProduction(Form):
   line = StringField('line')
   sku = IntegerField('sku', default = 0)
   qty = IntegerField('qty', default = 0)
   price = IntegerField('price', default = 0)

class ProductionReport(Form):
   factory_id = StringField('Factory ID')
   year = StringField('Year')
   month = StringField('Month')
   line_production = FieldList(FormField(LineProduction), label='line_production')

正如這里提到的

request.data包含傳入的請求數據作為字符串,以防它帶有 Flask 無法處理的 mimetype。

這就是你在request.data得到空字符串的原因

您可以將request.form轉換為 dict,正如您提到的,它是MultiDict對象,但可以使用to_dict方法簡單地將其轉換為dict對象。 使用dict對象,您可以dict

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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