поднять MultiValueDictKeyError (ключ) с помощью POST VXML

Я получаю следующую ошибку: поднять MultiValueDictKeyError(key): django.utils.datastructures.MultiValueDictKeyError: 'redirect', когда я пытаюсь сохранить значение, которое вводит пользователь.

Сначала я подумал, что это как-то связано с входным значением, но поскольку ошибка явно возвращает «перенаправление», я предполагаю, что это как-то связано с перенаправлением на следующую часть приложения. Я пробовал две разные версии обратного перенаправления, но очень запутанно, что именно сейчас правильно.

В то же время я получаю повышение NoReverseMatch (msg), когда пытаюсь отправить входное значение в базу данных.

Посмотреть

def InputData(request, element_id, session_id):
    input_element = get_object_or_404(InputData_model, pk=element_id)
    voice_service = input_element.service
    session = lookup_or_create_session(voice_service, session_id)

    if request.method == "POST":
        session = get_object_or_404(CallSession, pk=session_id)
        value = 'DTMF_input'
        result = UserInput()
        result.input_value = request.POST.get('input_value')
        result.session = session
        result.category = input_element.input_category 
        result.save()

        return redirect(request.POST['redirect'])

шаблон

<form id="input_form">
  <property name="interdigittimeout" value="2s"/>
 <property name="timeout" value="4s"/>
 <property name="termchar" value="#" />
  <field name="input_value" type="digits?minlength=1;maxlength=5">
    <prompt>
     <audio src="{{ ask_input_label }}"/>
    </prompt>

    <filled>

     <assign name="redirect" expr="'{{ redirect_url }}'"/>
     <submit next="{{ url }}" enctype="multipart/form-data" namelist="input_value" method="post"/>
     <goto next="{{ redirect_url }}" />
    </filled>
  </field>
</form>

проследить

Internal Server Error: /vxml/InputData/33/57
File "/app/.heroku/python/lib/python3.6/site-packages/django/utils/datastructures.py", line 77, in __getitem__
list_ = super().__getitem__(key)
KeyError: 'redirect'
During handling of the above exception, another exception occurred:
Traceback (most recent call last):
File "/app/.heroku/python/lib/python3.6/site-packages/django/core/handlers/exception.py", line 34, in inner
response = get_response(request)
File "/app/.heroku/python/lib/python3.6/site-packages/django/core/handlers/base.py", line 126, in _get_response
response = self.process_exception_by_middleware(e, request)
File "/app/.heroku/python/lib/python3.6/site-packages/django/core/handlers/base.py", line 124, in _get_response
response = wrapped_callback(request, *callback_args, **callback_kwargs)
File "/app/vsdk/service_development/views/vse_input.py", line 55, in InputData
return redirect(request.POST['redirect'])
File "/app/.heroku/python/lib/python3.6/site-packages/django/utils/datastructures.py", line 79, in __getitem__
raise MultiValueDictKeyError(key)
django.utils.datastructures.MultiValueDictKeyError: 'redirect'
Internal Server Error: /vxml/InputData/33/57
Traceback (most recent call last):
File "/app/.heroku/python/lib/python3.6/site-packages/django/utils/datastructures.py", line 77, in __getitem__
list_ = super().__getitem__(key)
KeyError: 'redirect'
During handling of the above exception, another exception occurred:
Traceback (most recent call last):
File "/app/.heroku/python/lib/python3.6/site-packages/django/core/handlers/exception.py", line 34, in inner
response = get_response(request)
File "/app/.heroku/python/lib/python3.6/site-packages/django/core/handlers/base.py", line 126, in _get_response
response = self.process_exception_by_middleware(e, request)
File "/app/.heroku/python/lib/python3.6/site-packages/django/core/handlers/base.py", line 124, in _get_response
response = wrapped_callback(request, *callback_args, **callback_kwargs)
File "/app/vsdk/service_development/views/vse_input.py", line 55, in InputData
return redirect(request.POST['redirect'])
File "/app/.heroku/python/lib/python3.6/site-packages/django/utils/datastructures.py", line 79, in __getitem__
raise MultiValueDictKeyError(key)
django.utils.datastructures.MultiValueDictKeyError: 'redirect'
10.33.126.112 - - [29/Apr/2019:19:47:02 +0200] "POST /vxml/InputData/33/57 HTTP/1.1" 500 67237 "http://petrichor-rain-system.herokuapp.com/vxml/InputData/33/57" "Voxeo-VXML/16.0.4.5.89134"

Вывод: я полностью запутался во всех ошибках, которые я получаю в этом коде, и я больше не знаю, что делать. Кто-нибудь захочет помочь мне сделать эту работу?


person Natasja    schedule 03.05.2019    source источник
comment
Django вызывает django.utils.datastructures.MultiValueDictKeyError, если ключ не существует в запросе. каков результат print(request.POST) ?   -  person HariHaraSudhan    schedule 03.05.2019
comment
это просто означает, что ваши данные POST не имеют пары ключ/значение перенаправления. Я действительно не понимаю VXML, поэтому я действительно не знаю, какой клиент интерпретирует VXML и что должно быть опубликовано в форме, но наверняка ваша форма не отправляет значение перенаправления, которое вы указали в ‹assign› ярлык. то есть проблема связана с вашим шаблоном или с клиентом, использующим его для отправки данных.   -  person dirkgroten    schedule 03.05.2019


Ответы (1)


Чтобы помочь вам понять эти трассировки ошибок, обычный способ посмотреть на них таков:

  1. Найдите строку(и), которые относятся к файлам, являющимся частью вашего собственного кода:

    • So File "/app/vsdk/service_development/views/vse_input.py"
    • Не File "/app/.heroku/python/lib/python3.6/site-packages/django/core/handlers/base.py" или любая строка в папках python3.6/site-packages

    В этом случае есть только одна строка вашего кода, так что это легко. Если строк несколько, начинать нужно с самой нижней.

  2. Посмотрите на место ошибки:

    • line 55, in InputData
    • return redirect(request.POST['redirect'])

    Это говорит вам, где именно возникает исключение

  3. Посмотрите на исключение: django.utils.datastructures.MultiValueDictKeyError: 'redirect'. Это говорит вам больше о том, что не так. KeyError означает, что ключ не существует в словаре. Здесь у нас особый тип словаря (ключи могут иметь несколько значений). Но в основном смысл таков: этого ключа ("перенаправления") не существует, поэтому я не могу получить к нему доступ.

Если вы print(request.POST.get('redirect')), вы увидите, что это None.

person dirkgroten    schedule 03.05.2019
comment
Спасибо за подробное объяснение, но мой следующий вопрос будет заключаться в том, как это решить? - person Natasja; 03.05.2019
comment
Я думаю, что ‹assign› просто присваивает переменную, она не добавляется к полям, отправленным формой. Вы должны посмотреть, как отправить эквивалент скрытых полей ввода в vxml. Проблема в вашем vxml, а я не знаком с vxml. - person dirkgroten; 03.05.2019