Swagger с Flask-Restplus, API и несколькими чертежами - PullRequest
0 голосов
/ 22 февраля 2019

Я создаю очень сложный микросервис, используя Flask и Flask-Restplus.
У него будет много конечных точек, поэтому я объединяю каждую конечную точку в отдельный 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():
    ...

Опять же: Я могу получить доступ к своим конечным точкам через почтальона, но пользовательский интерфейс swagger-UI не 'ничего не показывать:

enter image description here

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

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

, но это некажется невозможным с несколькими Blueprints.

Может кто-нибудь показать мне, как добавить / зарегистрировать эти Blueprints (endpointa_api, endpointb_api и endpointc_api) с Api?

1 Ответ

0 голосов
/ 25 февраля 2019

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

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

Об обоих вы можете прочитать в документации: 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до чертежа.

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)
...