Колба: неизвестная ошибка, хотя возвращается код ответа 200 - PullRequest
0 голосов
/ 29 мая 2019

Я создал простой API RESTful Flask с одной функцией, используемой для обслуживания запросов GET и ожидающей нескольких параметров URL:

import logging

from flask import Flask
from flask_restful import Api, Resource
from webargs import fields
from webargs.flaskparser import abort, parser, use_args

# initialize the Flask application and API
app = Flask(__name__)
api = Api(app)


# ------------------------------------------------------------------------------
# set up a basic, global logger object which will write to the console
logging.basicConfig(level=logging.INFO,
                    format="%(asctime)s %(levelname)s  %(message)s",
                    datefmt="%Y-%m-%d  %H:%M:%S")
_logger = logging.getLogger(__name__)


# ------------------------------------------------------------------------------
class Abc(Resource):

    abc_args = {"rtsp": fields.Url(required=True),
                "start": fields.Integer(required=True),
                "duration": fields.Integer(required=True),
                "bucket": fields.String(required=True),
                "prefix": fields.String(missing="")}

    @use_args(abc_args)
    def get(self, args) -> (str, int):

        _logger.info("Recording video clip with the following parameters:\n"
                     f"\tRTSP URL: {args['rtsp']}"
                     f"\tStart seconds: {args['start']}"
                     f"\tDuration seconds: {args['duration']}"
                     f"\tS3 bucket: {args['bucket']}"
                     f"\tS3 key prefix: {args['prefix']}")

        return "OK", 200


# ------------------------------------------------------------------------------
# This error handler is necessary for usage with Flask-RESTful
@parser.error_handler
def handle_request_parsing_error(err, req, schema, error_status_code, error_headers):
    """
    webargs error handler that uses Flask-RESTful's abort function to return
    a JSON error response to the client.
    """
    abort(error_status_code, errors=err.messages)


# ------------------------------------------------------------------------------
if __name__ == '__main__':
    api.add_resource(Abc, "/abc", endpoint="abc")
    app.run(debug=True)

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

Например, если я введу следующий URL-адрес без ожидаемых параметров в Chromeадресная строка браузера: http://127.0.0.1:5000/abc Затем я вижу это в консоли:

2019-05-28  17:42:14 INFO  127.0.0.1 - - [28/May/2019 17:42:14] "GET /abc HTTP/1.1" 200 -

Я предполагаю, что приведенное выше должно вызвать какую-то ошибку, указывающую на отсутствующие параметры URL.

ЕслиЯ ввожу следующий URL с ожидаемыми параметрами в адресную строку моего браузера Chrome: http://127.0.0.1:5000/abc?rtsp=rtsp://user:passwd@171.25.14.15:554&start=1559076593&duration=10&bucket=testbucket&prefix=test. Затем я вижу это в консоли:

2019-05-28  17:45:31 INFO  127.0.0.1 - - [28/May/2019 17:45:31] "GET /abc?rtsp=rtsp://user:passwd@171.25.14.15:554&start=1559076593&duration=10&bucket=testbucket&prefix=test. HTTP/1.1" 200 -

Я предполагаю, что приведенное выше должно заставить регистратор печатать информациюсообщение на консоль, как определено в функции Abc.get.

Если я использую curl в командной строке, тогда я получаю следующий результат:

$ curl "http://127.0.0.1:5000/abc?rtsp=rtsp://user:passwd@171.25.14.15:554&start=1559076593&duration=10&bucket=testbucket&prefix=test."
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2 Final//EN">
<title>None Unknown Error</title>
<h1>Unknown Error</h1>
<p></p>

Куда это идет?неправильно, а как мне добиться ожидаемого поведения?(Мое намерение состоит в том, чтобы использовать этот подход для передачи аргументов более реалистичному обработчику GET, который запустит функцию записи видео при получении запроса, приведенное выше было максимально упрощено для ясности.)

IЯ использую Flask 1.0.3, Flask-Restful 0.3.6 и Webargs 5.3.1 в среде Anaconda (Python 3.7) в Ubuntu 18.04.

1 Ответ

0 голосов
/ 29 мая 2019

Мне удалось получить ожидаемое поведение, используя более простой код, который не зависит от flask_restful. Смотри ниже:

import logging

from flask import Flask, request

# initialize the Flask application
app = Flask(__name__)


# ------------------------------------------------------------------------------
# set up a basic, global logger object which will write to the console
logging.basicConfig(level=logging.INFO,
                    format="%(asctime)s %(levelname)s  %(message)s",
                    datefmt="%Y-%m-%d  %H:%M:%S")
_logger = logging.getLogger(__name__)


# ------------------------------------------------------------------------------
@app.route('/clip', methods=['GET'])
def record_and_store_clip():

    message = "Recording video clip with the following parameters:\n" + \
              f"\tRTSP URL: {request.args.get('rtsp')}\n" + \
              f"\tStart seconds: {request.args.get('start')}\n" + \
              f"\tDuration seconds: {request.args.get('duration')}\n" + \
              f"\tS3 bucket: {request.args.get('bucket')}\n" + \
              f"\tS3 key prefix: {request.args.get('prefix')}\n"

    _logger.info(message)

    return message


# ------------------------------------------------------------------------------
if __name__ == '__main__':
    app.run(debug=True)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...