Connexion: AttributeError : l'objet 'App' n'a pas d'attribut 'handle_exception'

Créé le 28 avr. 2016  ·  4Commentaires  ·  Source: zalando/connexion

La description

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.

Comportement attendu

Il devrait pouvoir démarrer le serveur et localhost:5000/v1/ui devrait rendre l'interface utilisateur swagger.

Comportement réel

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

Étapes à reproduire

Utilisez l'instance de l'application de connexion pour initialiser flask-restful au lieu de l'instance flask.

Information additionnelle:

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
  • `Python 2.7.111
  • pip show connexion | grep "^Version\:"
  • 'Metadata-Version : 2.0 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'`

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

Tous les 4 commentaires

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.

Cette page vous a été utile?
0 / 5 - 0 notes