【问题标题】:ValueError: dictionary update sequence element #0 has length 1; 2 is required (Flask json.dumps)ValueError:字典更新序列元素 #0 的长度为 1; 2 是必需的(Flask json.dumps)
【发布时间】:2020-03-09 04:51:20
【问题描述】:

我有一个表单,它会在提交表单后重定向到另一个路由以从 docx 模板生成报告。但是有一个错误(我怀疑这是我的 json 问题,我会在那里详细分解)

退款表单的路径

@app.route('/chargeback-form', methods=['GET', 'POST'])
def chargeback_form():

    form = ChargebackForm()

    if request.method == 'POST': #this block is only entered when the form is submitted

        return redirect(url_for('render_cb_form'), code=307)


    return render_template('chargeback_form.html', form=form)

提交表单后render-cb-form的路由

@app.route('/render-cb-form', methods=['POST','GET'])
def render_cb_form():

    final_result = json.dumps(request.form)

    template = 'chargeback_template.docx'
    document = from_template(template, final_result)
    document.seek(0)

    return send_file(
        document, mimetype='application/vnd.openxmlformats-'
        'officedocument.wordprocessingml.document', as_attachment=True,
        attachment_filename='generated_chargeback_form.docx')

这是我的 from_template 函数

def from_template(template, json_result):
    target_file = StringIO()

    template = DocxTemplate(template)
    context = json_result  # gets the json result used to render the document

    target_file = BytesIO()
    template.render(context)
    template.save(target_file)

    return target_file

我的 cmd 中的错误

[2020-03-09 12:31:51,463] ERROR in app: Exception on /render-cb-form [POST]
Traceback (most recent call last):
  File "c:\users\ad0334\desktop\boost\debugging_env\debug_env\lib\site-packages\flask\app.py", line 2446, in wsgi_app
    response = self.full_dispatch_request()
  File "c:\users\ad0334\desktop\boost\debugging_env\debug_env\lib\site-packages\flask\app.py", line 1951, in full_dispatch_request
    rv = self.handle_user_exception(e)
  File "c:\users\ad0334\desktop\boost\debugging_env\debug_env\lib\site-packages\flask\app.py", line 1820, in handle_user_exception
    reraise(exc_type, exc_value, tb)
  File "c:\users\ad0334\desktop\boost\debugging_env\debug_env\lib\site-packages\flask\_compat.py", line 39, in reraise
    raise value
  File "c:\users\ad0334\desktop\boost\debugging_env\debug_env\lib\site-packages\flask\app.py", line 1949, in full_dispatch_request
    rv = self.dispatch_request()
  File "c:\users\ad0334\desktop\boost\debugging_env\debug_env\lib\site-packages\flask\app.py", line 1935, in dispatch_request
    return self.view_functions[rule.endpoint](**req.view_args)
  File "C:\Users\AD0334\Desktop\Boost\debugging_env\app\routes.py", line 69, in render_cb_form
    document = from_template(template, final_result)
  File "C:\Users\AD0334\Desktop\Boost\debugging_env\app\generate_docx.py", line 21, in from_template
    template.render(context)
  File "c:\users\ad0334\desktop\boost\debugging_env\debug_env\lib\site-packages\docxtpl\__init__.py", line 266, in render
    xml_src = self.build_xml(context, jinja_env)
  File "c:\users\ad0334\desktop\boost\debugging_env\debug_env\lib\site-packages\docxtpl\__init__.py", line 229, in build_xml
    xml = self.render_xml(xml, context, jinja_env)
  File "c:\users\ad0334\desktop\boost\debugging_env\debug_env\lib\site-packages\docxtpl\__init__.py", line 211, in render_xml
    dst_xml = template.render(context)
  File "c:\users\ad0334\desktop\boost\debugging_env\debug_env\lib\site-packages\jinja2\environment.py", line 1086, in render
    vars = dict(*args, **kwargs)
ValueError: dictionary update sequence element #0 has length 1; 2 is required
127.0.0.1 - - [09/Mar/2020 12:31:51] "[35m[1mPOST /render-cb-form HTTP/1.1[0m" 500 -

当我试图找出问题时,我尝试在“/render-cb-form”中打印我的“final_result”:

{"csrf_token": "blablabla.blabbla", "cb_ref_no": "cb01201", "cb_date": "1/1/20", "received_date": "20/4/20", "type_card_no": "ABC XXXX 1234", "reason": "scam", "tranx_date": "17/6/20", "amount": "RM567.89"}

当我刚刚将 dict 硬编码到我的函数中时,docx 生成器工作正常,但是当我尝试作为 json 传递时,会弹出 ValueError。非常感谢任何帮助!

【问题讨论】:

    标签: python-3.x flask python-requests python-docx


    【解决方案1】:

    发现错误出在这行代码:

    final_result = json.dumps(request.form)
    

    显然json.dumps以字符串的形式返回结果,需要在“final_result”下面添加另一行代码:

    final_result = json.loads(final_result)
    

    将字符串转换回 JSON。无论如何,如果有更有效的方法来编写上面的代码,请赐教!提前谢谢你:)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-02-22
      • 2021-04-01
      • 2016-02-17
      • 2019-08-10
      • 1970-01-01
      • 2017-12-27
      • 1970-01-01
      相关资源
      最近更新 更多