【发布时间】: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