J'écris une application principale de flacon qui utilise Flask-restful. J'ai créé swagger.yaml à l'aide de l'éditeur en ligne de swagger.io et exporté son implémentation de serveur basée sur la connexion de l'interface utilisateur de swagger. J'ai fusionné ce code avec mon application existante et après cela, j'ai essayé d'exécuter mon application.
Il devrait pouvoir démarrer le serveur et localhost:5000/v1/ui devrait rendre l'interface utilisateur swagger.
Le code ne se compile pas et échoue pendant que j'essaie d'utiliser l'instance de flacon de connexion avec flask-restful.
Ci-dessous, la trace de la pile :
Traceback (appel le plus récent en dernier) :
Fichier "app.py", ligne 17, dans
api = Api (application Web)
Fichier "C:\stuff\Git\museum_link_curation\flask-backend\lib\site-packages\flask_restful__init__.py", ligne 96, dans init
self.init_app(app)
Fichier "C:\stuff\Git\museum_link_curation\flask-backend\lib\site-packages\flask_restful__init__.py", ligne 118, dans init_app
self._init_app(app)
Fichier "C:\stuff\Git\museum_link_curation\flask-backend\lib\site-packages\flask_restful__init__.py", ligne 195, dans _init_app
app.handle_exception = partial(self.error_router, app.handle_exception)
AttributeError : l'objet 'App' n'a pas d'attribut 'handle_exception'
Ci-dessous le code que j'ai modifié pour fusionner la connexion :
#webapp = Flask(__name__) # commented
webapp = connexion.App(__name__, specification_dir='swagger/') # newly added
webapp.add_api('swagger.yaml') #newly added
api = Api(webapp) #existing
...
if __name__ == '__main__': #existing
webapp.run(debug=True) #existing
Utilisez l'instance de l'application de connexion pour initialiser flask-restful au lieu de l'instance flask.
Fonctionne sur une machine Windows 10. Principalement sur Python 2 avec les hacks mentionnés à partir de http://stackoverflow.com/questions/36416679/error-generating-swagger-server-python-flask-from-swagger-editor. Cependant, testé sur Python3 et la même erreur arrive également.
Sortie des commandes :
python --version
pip show connexion | grep "^Version\:"
Nom : connexion
Version : 1.0.91
Résumé : Connexion - API first applications avec OpenAPI/Swagger et Flask
Page d'accueil : https://github.com/zalando/connexion
Auteur : Zalando SE
Auteur-email : UNKNOWN
Installateur : pip
Licence : Apache License Version 2.0
Emplacement : c:\stuff\git\museum_link_curation\flask-backend\lib\site-packages
Requiert : request, swagger-spec-validator, six, strict-rfc3339, PyYAML, flask, pathlib, jsonschema
Classificateurs :
Langage
Langage
Langage
Langage
Statut de développement :: 5 - Production/Stable
Public visé :: Développeurs
Système d'exploitation :: Indépendant du système d'exploitation
Sujet :: Internet :: WWW/HTTP :: WSGI :: Application
' Sujet :: Développement de logiciels :: Bibliothèques :: Appliquer Cadres cationiques'`J'ai rencontré un problème similaire et la raison en est que connexion.App
n'est pas un échange direct contre Flask
. connexion encapsule cependant l'instance Flask dans une variable app
Si votre code d'origine est :
webapp = Flask(__name__)
api = Api(webapp)
Alors l'équivalent de connexion est :
connexion_app = connexion.App(__name__)
connexion_app.add_api('swagger.yaml')
webapp = connexion_app.app
Vous n'avez pas besoin de créer une instance API
puisque la connexion le fait pour vous.
Avis de non-responsabilité : cela peut entraîner des effets secondaires inattendus, encore introuvables, mais jusqu'à présent, cela fonctionne pour moi.
@ trente3 Vous avez raison.
@mit2nil Pourriez-vous nous faire savoir si cela résout votre problème ?
Merci @rafaelcaricio et @thirty3 . Oui cela a résolu le problème.
J'ai également rencontré le même problème, pouvez-vous s'il vous plaît m'aider à résoudre ce problème. J'ai déjà essayé la méthode ci-dessus.
Commentaire le plus utile
J'ai rencontré un problème similaire et la raison en est que
connexion.App
n'est pas un échange direct contreFlask
. connexion encapsule cependant l'instance Flask dans une variableapp
Si votre code d'origine est :
Alors l'équivalent de connexion est :
Vous n'avez pas besoin de créer une instance
API
puisque la connexion le fait pour vous.Avis de non-responsabilité : cela peut entraîner des effets secondaires inattendus, encore introuvables, mais jusqu'à présent, cela fonctionne pour moi.