Flask + Flask-RESTful: сопоставить конкретные переменные с маршрутами - PullRequest
0 голосов
/ 25 марта 2019

Как мне добиться следующего?

# only if model_type in ['a', 'b', 'c']
api.add_resource(FooAPI, '/<string:model_type'>

# only if model_type in ['x', 'y', 'z']
api.add_resource(BarAPI, '/<string:model_type'>

Вместо того, чтобы иметь следующий код:

api.add_resource(FooAAPI, '/a'>
api.add_resource(FooBAPI, '/b'>
api.add_resource(FooCAPI, '/c'>

api.add_resource(BarXAPI, '/x'>
api.add_resource(BarYAPI, '/y'>
api.add_resource(BarZAPI, '/z'>

1 Ответ

1 голос
/ 26 марта 2019

Вы можете использовать any конвертер с вашим желаемым путем и одновременно работать с media_type в качестве переменной:

api.add_resource(FooAPI, '/<any(a, b, c):model_type>')
api.add_resource(BarAPI, '/<any(x, y, z):model_type>')

Если вы хотите, чтобы они были динамическими:

FooAPIOptions = ['a', 'b', 'c']

api.add_resource(
    FooAPI, "/<any({}):model_type>".format(str(FooAPIOptions)[1:-1]))

Простое приложение будет:

from flask import Flask
from flask_restful import Resource, Api

app = Flask(__name__)
api = Api(app)


class FooAPI(Resource):
    def get(self, model_type=None):
        print(model_type) # for example it prints a for "/a" path
        return {'hello': 'world'}


FooAPIOptions = ['a', 'b', 'c']

api.add_resource(
    FooAPI, "/<any({}):model_type>".format(str(FooAPIOptions)[1:-1]))

if __name__ == '__main__':
    app.run(debug=True)
...