7 votes

Swagger avec Flask-Restplus, API et Blueprints multiples

Je suis en train de construire un microservice très complexe en utilisant Flask et Flask-Restplus.
Il aura de nombreux points d'extrémité, donc j'organise chaque point d'extrémité dans un Blueprint séparé.

  • Actuellement, je me débats avec l'utilisation de Flask-Restplus et de l'API. l'utilisation de plusieurs Blueprints en combinaison avec swagger
  • Je veux être en mesure d'obtenir tous les points de terminaison de mes bleus dans le swagger intégré de l'API, mais cela ne semble pas fonctionner.
  • Je peux accéder à mes points de terminaison via postman, mais l'interface utilisateur swagger ne montre rien :(

L'exemple suivant de code et de structure de répertoire devrait vous donner une idée de mon idée :

.
 endpoints
    endpointa.py
    endpointb.py
    endpointc.py
    __init__.py
 __init__.py
 run.py

Mon principal init .py ressemble à ceci :

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 avec le Blueprint correspondant :

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

Encore une fois :

Je peux accéder à mes points de terminaison via postman, mais la swagger-UI ne montre rien :

enter image description here

Normalement, je devrais ajouter des points de terminaison à l'API en utilisant quelque chose comme

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

mais cela ne semble pas être possible avec des Blueprints multiples.

Quelqu'un peut-il me montrer comment ajouter/enregistrer ces Blueprints (endpointa_api, endpointb_api et endpointc_api) avec Api ?

9voto

Robbe Points 1110

Il y a 2 solutions possibles en utilisant Flask-Restplus :

  • Utiliser les espaces de noms de Flask-RestPlus
  • Transformez vos schémas directeurs en Flask-RestPlus Api s

Vous pouvez lire les deux dans la documentation : https://flask-restplus.readthedocs.io/en/stable/scaling.html

Espaces de noms

Flask-RESTPlus fournit un moyen d'utiliser presque le même modèle que le blueprint de Flask. L'idée principale est de diviser votre application en espaces de noms réutilisables.

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)

Plan d'action Apis

Voici un exemple de la façon de relier une Api à un Blueprint.

from flask import Blueprint
from flask_restplus import Api

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

L'utilisation d'un blueprint vous permettra de monter votre API sur n'importe quel préfixe d'url et/ou sous-domaine de votre application :

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)

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X