Swagger с Flask-Restplus, API и несколькими Blueprints

I'm building a very complex microservice using Flask and Flask-Restplus.
It will have many endpoints, thus I'm organizing each endpoint into a separate Blueprint.

  • В настоящее время я борюсь с использованием Flask-Restplus и API с использованием нескольких Blueprints в сочетании с swagger.
  • Я хочу получить все конечные точки моих чертежей во встроенном API-интерфейсе, но это, похоже, не работает.
  • Я могу получить доступ к своим конечным точкам через почтальона, но пользовательский интерфейс swagger ничего не показывает. :(

Следующий пример кода и структура каталогов должны подсказать вам мою идею:

.
├── endpoints
│   ├── endpointa.py
│   ├── endpointb.py
│   ├── endpointc.py
│   └── __init__.py
├── __init__.py
└── run.py

Мой основной init .py выглядит так:

from flask import Flask, Blueprint, logging, jsonify, request, Response
from flask_restplus import Resource, Api   


# create app and api
app = Flask(__name__)
api_prefix  = '/api/v1/'

# register Blueprints
from endpoints.endpointa import endpointa_api
app.register_blueprint(endpointa_api, url_prefix=api_prefix)

from endpoints.endpointb import endpointb_api
app.register_blueprint(endpointb_api, url_prefix=api_prefix)

from endpoints.endpointc import endpointc_api
app.register_blueprint(endpointc_api, url_prefix=api_prefix)


api = Api(app,
          version='1',
          title='Test Service REST-API',
          description='A REST-API for the Test Service, implemented in python')


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

endpointa.py с соответствующим Blueprint:

from os import environ
import json, ast, syslog
import requests
import gc
from flask import Flask, Blueprint, logging, jsonify, request, Response
from flask_restplus import Resource, Api

endpointa_api = Blueprint('endpointa_api', __name__)

@endpointa_api.route('testa', methods=['GET'])
def testa():
    ...


@endpointa_api.route('testa/<string:testa_id>', methods=['GET', 'POST'])
def testa_id():
    ...

Again:

I can access my endpoints via postman, but the swagger-UI doesn't show anything:

введите описание изображения здесь

Обычно я добавляю конечные точки в API, используя что-то вроде

api.add_resource(TestClass, api_prefix + 'test')

но, похоже, это невозможно с несколькими Blueprints.

Can anyone show me how to add/register these Blueprints (endpointa_api, endpointb_api and endpointc_api) with Api ?


person dacoda    schedule 22.02.2019    source источник
comment
очень сложный микросервис это какой-то оксюморон :)   -  person Adrian Krupa    schedule 22.02.2019
comment
Вы используете flask-restful или flask-restplus? Потому что вы описываете первое, а в примере используется второе.   -  person Adrian Krupa    schedule 22.02.2019
comment
Привет, извини, обновил свой пост. Я использую flask-restplus и пытаюсь зарегистрировать все мои Blueprints с помощью swagger.   -  person dacoda    schedule 25.02.2019


Ответы (1)


Есть 2 возможных решения с использованием Flask-Restplus:

  • Используйте пространства имен Flask-RestPlus
  • Превратите свои чертежи в Flask-RestPlus Apis

Вы можете прочитать об обоих в документации: https://flask-restplus.readthedocs.io/en/stable/scaling.html

Пространства имен

Flask-RESTPlus позволяет использовать почти тот же шаблон, что и в схеме Flask. Основная идея - разделить ваше приложение на многоразовые пространства имен.

from flask_restplus import Api

from .namespace1 import api as ns1
from .namespace2 import api as ns2
# ...
from .namespaceX import api as nsX

api = Api(
    title='My Title',
    version='1.0',
    description='A description',
    # All API metadatas
)

api.add_namespace(ns1)
api.add_namespace(ns2)
# ...
api.add_namespace(nsX)

Blueprint Apis

Вот пример того, как связать Api с Blueprint.

from flask import Blueprint
from flask_restplus import Api

blueprint = Blueprint('api', __name__)
api = Api(blueprint)
# ...

Использование схемы позволит вам смонтировать свой API на любом префиксе URL-адреса и / или поддомене в вашем приложении:

from flask import Flask
from apis import blueprint as api

app = Flask(__name__)
app.register_blueprint(api, url_prefix='/api/1')
app.run(debug=True)
person Robbe    schedule 25.02.2019
comment
Спасибо. Blueprint Apis: это пример привязки Api к ONE Blueprint, но я хочу иметь возможность связать Api с несколькими Blueprints. - person dacoda; 25.02.2019
comment
Вы можете сделать то же самое для каждого чертежа. Просто позвоните Api(blueprint) для каждого и зарегистрируйте их в своем приложении. - person Robbe; 25.02.2019
comment
Большое спасибо, я буду использовать пространства имен, которые лучше всего подходят для моих целей. :) - person dacoda; 01.03.2019
comment
Привет, @dacoda, если этот ответ вам помог, не могли бы вы отметить его как принятый, чтобы другим пользователям было ясно, что это сработало? - person Robbe; 07.03.2019
comment
Как я могу просто перейти к одной конечной точке, чтобы просмотреть все мои конечные точки swagger? При этом мне нужно сделать http://localhost:5000/<url_prefix> там, где раньше мне не нужно было определять префикс URL-адреса моего пространства имен. - person frlzjosh; 06.07.2021