Я создал простой 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.