Flask вызывает TypeError: функция просмотра не вернула правильный ответ - PullRequest
0 голосов
/ 09 января 2019

Я пытаюсь создать 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-формат, который я использовал для вызова 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) 

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

1 Ответ

0 голосов
/ 09 января 2019

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

Если запрос обрабатывается успешно, ответ не указывается, поэтому функция вернет 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 ''
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...