I want to create a resource that supports GET request in following way:
/bar?key1=val1&key2=val2
I tried this code, but it is not working
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')
Thanks!
Edit: reqparse
is no longer the recommended way to do this with flask-restful!, but there is another example using marshmallow below.
The reqparse
object is deprecated. See the docs or the second example in this post for alternatives.
Use reqparse
. You can see another example in the flask-restful docs.
It performs validation on the parameters and does not require 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)
Another way is to use marshmallow.
You can use a Schema
class,to validate request.args
(for a PUT/POST request you might validate request.form
)
from flask import Flask, request, abort
from flask_restful import Resource, Api
from marshmallow import Schema, fields
class BarQuerySchema(Schema):
key1 = fields.Str(required=True)
key2 = fields.Str(required=True)
app = Flask(__name__)
api = Api(app)
schema = BarQuerySchema()
class BarAPI(Resource):
def get(self):
errors = schema.validate(request.args)
if errors:
abort(400, str(errors))
return 'ok'
api.add_resource(BarAPI, '/bar', endpoint='bar')
# omit of you intend to use `flask run` command
if __name__ == '__main__':
app.run(debug=True)
This example requires that both parameters be present.