ValueError: элемент последовательности обновления словаря # 0 имеет длину 1; Требуется 2 (Flask json .dumps) - PullRequest
0 голосов
/ 09 марта 2020

У меня есть форма, которая будет перенаправлять на другой маршрут для создания отчета из шаблона 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 -

Когда я пытаюсь выяснить проблему, я попытался напечатать свой "final_result" в "/ render-cb-form":

{"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. Любая помощь с благодарностью!

1 Ответ

0 голосов
/ 09 марта 2020

Обнаружено, что ошибка заключается в этой строке кода:

final_result = json.dumps(request.form)

Видимо json .dumps возвращает результат в виде строки , необходимо добавить еще одну строку кода ниже "final_result":

final_result = json.loads(final_result)

, которые преобразуют строку обратно в JSON. Во всяком случае, если есть более эффективный способ написания кода выше, пожалуйста, просветите меня! Заранее спасибо:)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...