Flask вызывает TypeError: функция просмотра не вернула правильный ответ

1

Я пытаюсь создать REST API с помощью Python Flask, который получает файлы XML через POST. Я хотел бы, чтобы API считывал содержимое XML и искал один параметр/ключ ("Каталог"), чтобы решить, куда его отправлять, например, как коммутатор для других веб-приложений.

Основная проблема заключается в том, что я продолжаю получать 500 ошибок при использовании Flask request.data или request.form - один из этих методов должен работать с XML, согласно другим подобным постам.

Распространенное объяснение ошибки 500: "TypeError: функция представления не вернула правильный ответ. Функция либо вернула None, либо завершилась без оператора return".

Я пробовал запросы командной строки cURL, основанные на других потоках StackOverflow, посылать по одному XML за раз, но нет никакой разницы по сравнению с клиентской программой на python, которую я написал для отправки XML (используя библиотеку запросов).

Формат XML, который я использовал, чтобы cURL к API

<?xml version="1.0" encoding="UTF-8" ?>
<xml>
<Directory>Directory 2</Directory>
<ID>2</ID>
<Name>Jane</Name>
</xml>

Код API Python Flask:

from flask import Flask, request
import xmltodict
import requests

app = Flask(__name__)

@app.route("/XMLhandling", methods=["POST"])
def handleXML():
    #for debugging..
    if True:
        print("HEADERS", request.headers)
        print("REQ_path", request.path)
        print("ARGS", request.args)
        print("DATA", request.data)
        print("FORM",request.form)
    #parse the XML
    datacache = xmltodict.parse(request.form)
    print(datacache)
    print(datacache['xml']['Directory'])
    if datacache['xml']['Directory'] == "Directory 1":
        requests.post("http://localhost:25565/XML",data = xml)
    elif datacache['xml']['Directory'] == "Directory 2":
        requests.post("http://localhost:50001/XML",data = xml)
    else:
        return 400

if __name__ == '__main__':
    app.run(debug = True, port = 5000) 

Рад предоставить дополнительную информацию, если это необходимо.

Теги:
flask

1 ответ

0

Ошибка происходит, потому что представление не возвращает действительный ответ.

Если запрос обработан успешно, ответ не указан, поэтому функция вернет None, что является недопустимым ответом.

Если запрос не обработан успешно, функция возвращает целое число 400, которое также не является действительным ответом.

Для API может быть достаточно просто вернуть код состояния HTTP, чтобы функция могла вернуть пустую строку для успеха - это приведет к ответу 200 OK - или пустую строку и код состояния для неудачных запросов. Вы можете узнать больше об ответах колбы здесь.

Этот код должен работать:

@app.route("/XMLhandling", methods=["POST"])
def handleXML():
    #for debugging..
    if True:
        print("HEADERS", request.headers)
        print("REQ_path", request.path)
        print("ARGS", request.args)
        print("DATA", request.data)
        print("FORM",request.form)
    #parse the XML
    datacache = xmltodict.parse(request.form)
    print(datacache)
    print(datacache['xml']['Directory'])
    if datacache['xml']['Directory'] == "Directory 1":
        requests.post("http://localhost:25565/XML",data = xml)
    elif datacache['xml']['Directory'] == "Directory 2":
        requests.post("http://localhost:50001/XML",data = xml)
    else:
        # Return empty response body and status code.
        return '', 400
    # Return empty body (Flask will default to 200 status code)
    return ''

Ещё вопросы

Сообщество Overcoder
Наверх
Меню