Второй чертеж, зарегистрированный в Flask Restplus, не отображается в чванстве

Учитывая это приложение Flask Restplus:

from flask import Blueprint, Flask
from flask_restplus import Api, Resource

base_api_blueprint = Blueprint('base_api', __name__)
base_api = Api(base_api_blueprint)

bff_api_blueprint = Blueprint('bff_api', __name__)
bff_api = Api(bff_api_blueprint)

@base_api.route('/base', endpoint='base-endpoint')
class BaseResource(Resource):
    def get(self):
        return {"from":"base"}


@bff_api.route('/bff', endpoint='bff-endpoint')
class BffResource(Resource):
    def get(self):
        return {"from":"bff"}

app = Flask(__name__)
app.register_blueprint(base_api_blueprint)
app.register_blueprint(bff_api_blueprint)
api = Api(app)

if __name__ == '__main__':
    app.run(host='0.0.0.0', port=8080, debug=True)

Когда я перехожу к документу о чванстве в http://localhost:8080/, я вижу чванство для base_api_blueprint, но ничего для bff_api_blueprint. Если я изменю порядок вызовов register_blueprint (таким образом, bff_api_blueprint будет зарегистрирован первым), произойдет обратное -> показывает чванство для bff_api_blueprint, а для base_api_blueprint ничего.

Независимо от того, что говорит чванство, оба чертежа работают, то есть они возвращают ответы HTTP.

Как я могу «слить» чванство обоих чертежей в один?


person Mike Hogan    schedule 11.05.2018    source источник
comment
Я успешно переработал это, используя пространства имен Flask Restplus, но оставил этот вопрос здесь в надежде, что меня можно чему-то научить :)   -  person Mike Hogan    schedule 16.05.2018
comment
Вы когда-нибудь получали решение? У меня такая же проблема, и мне интересно, придерживаться ли чертежей или переключиться на пространства имен.   -  person Brain Monkey    schedule 02.08.2018
comment
так и не нашел решения, приятель, извини.   -  person Mike Hogan    schedule 03.08.2018


Ответы (2)


Из вашего кода, если вы хотите объединить документацию, вы будете использовать один экземпляр Api следующим образом:

from flask import Blueprint, Flask
from flask_restplus import Api, Resource

base_api_blueprint = Blueprint('base_api', __name__)
# base_api = Api(base_api_blueprint)
api = Api(base_api_blueprint, doc="/combined/") #the end point to your combined documentation api

base_ns = api.namespace('base_api', description='Base API')
bff_ns = api.namespace('bff_api', description='Bff API')

# bff_api_blueprint = Blueprint('bff_api', __name__)
# bff_api = Api(bff_api_blueprint)

@base_ns.route('/base', endpoint='base-endpoint')
class BaseResource(Resource):
    def get(self):
        return {"from":"base"}


@bff_ns.route('/bff', endpoint='bff-endpoint')
class BffResource(Resource):
    def get(self):
        return {"from":"bff"}

app = Flask(__name__)
app.register_blueprint(base_api_blueprint)
# app.register_blueprint(bff_api_blueprint)
api = Api(app)

if __name__ == '__main__':
    app.run(host='0.0.0.0', port=8080, debug=True)

Этот подход также использует пространства имен, и теперь ваши конечные точки будут выглядеть так:

/combined/
/base_api/base
/bff_api/bff

Если вы организовали свой проект с помощью чертежей, вы можете импортировать тот же экземпляр API в другие разделы проекта. Из документации Flask-RESTplus пространство имен соответствует тому же шаблону, что и план Flask. .

person user3657232    schedule 11.09.2018

Чтобы оба чертежа отображались на своих собственных страницах swagger, вам нужно использовать аргумент «url_prefix» в определении чертежа, как таковой:

from flask import Blueprint, Flask
from flask_restplus import Api, Resource

base_api_blueprint = Blueprint('base_api', __name__, url_prefix="base_api")
base_api = Api(base_api_blueprint)

bff_api_blueprint = Blueprint('bff_api', __name__, url_prefix="bff_api")
bff_api = Api(bff_api_blueprint)

Каждый план будет иметь страницу swagger, которую можно найти на http://localhost:8080/base_api и http://localhost:8080/bff_api.

Если, с другой стороны, вы хотите, чтобы обе конечные точки отображались в одном и том же чванстве, можно использовать один Blueprint и несколько пространств имен.

person Jens De Pelsmaeker    schedule 10.11.2019