![](/img/trans.png)
[英]Flask request.form is empty while request.get_data() is not
[英]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')
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.