如何使用Flagsgger与Flask应用程序使用蓝图?

时间:2017-01-12 02:35:50

标签: python flask swagger swagger-ui

我使用Flasgger将Swagger UI添加到我的Python Flask应用程序中。 Internet上最常见的示例是使用@app.route

的基本Flask样式
from flasgger.utils import swag_from

@app.route('/api/<string:username>')
@swag_from('path/to/external_file.yml')
def get(username):
    return jsonify({'username': username})

有效。

然而,在我的应用程序中,我没有使用@app.route装饰器来定义端点。我正在使用烧瓶蓝图。如下:

from flask import Flask, Blueprint
from flask_restful import Api, Resource
from flasgger.utils import swag_from
...

class TestResourceClass(Resource):

      @swag_from('docs_test_get.yml', endpoint='test')   
      def get() :
         print "This is the get method for GET /1.0/myapi/test endpoint"

app = Flask(__name__)
my_api_blueprint = Blueprint('my_api', __name__)
my_api = Api(my_api_blueprint)

app.register_blueprint(my_api_blueprint, url_prefix='/1.0/myapi/')

my_api.add_resource(TestResourceClass, '/test/'
                        endpoint='test',
                        methods=['GET', 'POST', 'PUT', 'PATCH', 'DELETE'])
....

如上所示,我在绑定到GET方法端点的@swag_from方法上使用了TestResourceClass.get()装饰器。我在两个地方也有匹配的端点= test

但是我在Swagger UI上没有得到任何东西,它全都是空白的。 docs_test_get.yml文件包含有效的yaml标记以定义swagger规范。

我错过了什么?如何让Flasgger Swagger UI与基于Flask Blueprint的设置配合使用?

4 个答案:

答案 0 :(得分:2)

现在有一个https://github.com/rochacbruno/flasgger/blob/master/examples/example_blueprint.py

中的蓝图应用示例
"""
A test to ensure routes from Blueprints are swagged as expected.
"""
from flask import Blueprint, Flask, jsonify

from flasgger import Swagger
from flasgger.utils import swag_from

app = Flask(__name__)

example_blueprint = Blueprint("example_blueprint", __name__)


@example_blueprint.route('/usernames/<username>', methods=['GET', 'POST'])
@swag_from('username_specs.yml', methods=['GET'])
@swag_from('username_specs.yml', methods=['POST'])
def usernames(username):
    return jsonify({'username': username})


@example_blueprint.route('/usernames2/<username>', methods=['GET', 'POST'])
def usernames2(username):
    """
    This is the summary defined in yaml file
    First line is the summary
    All following lines until the hyphens is added to description
    the format of the first lines until 3 hyphens will be not yaml compliant
    but everything below the 3 hyphens should be.
    ---
    tags:
      - users
    parameters:
      - in: path
        name: username
        type: string
        required: true
    responses:
      200:
        description: A single user item
        schema:
          id: rec_username
          properties:
            username:
              type: string
              description: The name of the user
              default: 'steve-harris'
    """
    return jsonify({'username': username})


app.register_blueprint(example_blueprint)

swag = Swagger(app)

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

答案 1 :(得分:1)

在引用端点时,您只需要添加蓝图的名称。蓝图创建名称空间。下面的例子。有用的提示:使用app.logger.info(url_for('hello1'))调试端点问题-它显示了非常有用的错误消息,例如Could not build url for endpoint 'hello1'. Did you mean 'api_bp.hello1' instead?

from flask import Flask, Blueprint, url_for
from flask_restful import Api, Resource
from flasgger import Swagger, swag_from

app = Flask(__name__)
api_blueprint = Blueprint('api_bp', __name__)
api = Api(api_blueprint)


class Hello(Resource):

    @swag_from('hello1.yml', endpoint='api_bp.hello1')
    @swag_from('hello2.yml', endpoint='api_bp.hello2')
    def get(self, user=''):
        name = user or 'stranger'
        resp = {'message': 'Hello %s!' % name}
        return resp


api.add_resource(Hello, '/hello', endpoint='hello1')
api.add_resource(Hello, '/hello/<string:user>', endpoint='hello2')

app.register_blueprint(api_blueprint)
swagger = Swagger(app)

app.run(debug=True)


答案 2 :(得分:0)

swag_from函数有一些错误来解析文件路径。你可以先使用doc string在get()中定义api。 flasgger将解析像get,post。这样的MethodView()方法。

答案 3 :(得分:0)

似乎闪光灯不起作用或没有适当的支持蓝色打印样式Flask定义(尚未)。我使用https://github.com/rantav/flask-restful-swagger效果很好!