Колба restful: передача параметров в запрос GET
Я хочу создать ресурс, который поддерживает запрос GET следующим образом:
/bar?key1=val1&key2=val2
Я пробовал этот код, но он не работает
app = Flask(__name__)
api = Api(app)
class BarAPI(Resource):
def get(key1, key2):
return jsonify(dict(data=[key1, key2]))
api.add_resource(BarAPI, '/bar', endpoint='bar')
Спасибо!
4 ответа
Flask может анализировать аргументы через запрос
from flask import request
Вы можете использовать следующие строки в блоке, который требует GET-параметров. GET объявлен в @app.route()
декларация.
args = request.args
print (args) # For debugging
no1 = args['key1']
no2 = args['key2']
return jsonify(dict(data=[no1, no2])) # or whatever is required
Изменить: это больше не рекомендуемый способ сделать это с колбой-отдых! reqparse
объект устарел, см. документацию для рекомендуемой альтернативы.
использование reqparse
, Вы можете увидеть другой пример в документах по колбе.
Он выполняет проверку параметров и не требует jsonify
,
from flask import Flask
from flask_restful import Resource, Api, reqparse
app = Flask(__name__)
api = Api(app)
class BarAPI(Resource):
def get(self):
parser = reqparse.RequestParser()
parser.add_argument('key1', type=str)
parser.add_argument('key2', type=str)
return parser.parse_args()
api.add_resource(BarAPI, '/bar', endpoint='bar')
if __name__ == '__main__':
app.run(debug=True)
Поскольку reqparse
не рекомендуется вот решение с использованием библиотеки WebArgs:
from flask import Flask
from flask_restful import Api, Resource, abort
from webargs import fields, validate
from webargs.flaskparser import use_kwargs, parser
app = Flask(__name__)
api = Api(app)
class Foo(Resource):
args = {
'bar': fields.Str(
required=True,
validate=validate.OneOf(['baz', 'qux']),
),
}
@use_kwargs(args)
def get(self, bar):
return {'bar': bar}
api.add_resource(Foo, '/foo', endpoint='foo')
# This error handler is necessary for usage with Flask-RESTful.
@parser.error_handler
def handle_request_parsing_error(err):
abort(422, errors=err.messages)
if __name__ == '__main__':
app.run(debug=True)
Для большего количества примеров взгляните на пример Flask-RESTful в репозитории WebArgs.
Ответ @severen датирован 2016 годом и немного устарел в отношении вебарг. Насколько я понимаю, с основным обновлением до 6.0.0 (в 2020 году) декоратор по умолчанию просматривает полезную нагрузку json и игнорирует параметры в запросе. Чтобы добавить эту подсказку, добавьтеlocation="query"
декоратору (см. выпуск github ).
В приведенном выше примере рабочая конечная точка, которая принимает запрос GET, будет выглядеть так:
class Foo(Resource):
@use_kwargs({"bar": fields.Str(), }, location="query")
def get(self, bar):
return {'message': 'Hello, ' + bar}, 200