À l'aide de flacon à l'intérieur de la classe
J'ai une application avec de nombreux fils. L'un d'eux est fiole, qui est utilisé pour mettre en œuvre (axillaire) de l'API. Il est utilisé avec faible charge et jamais exposé à l'Internet, afin de construire-dans le flacon serveur web est parfaitement bien.
Mon code ressemble à ceci:
class API:
# ... all other stuff here, skipped
def run():
app = flask.Flask('API')
@app.route('/cmd1')
def cmd1():
self.cmd1()
@app.route('/cmd2')
def cmd2()
self.cmd2()
app.run()
Je sens que je fait de mal, parce que tous les docs dit "créer un flacon d'application au niveau du module'. Mais je ne veux pas le faire - il gâcher avec mes tests, et de l'API est une petite partie de la plus grande application, qui a le propre de la structure et des accords (chaque "application" est une catégorie distincte de l'exécution dans un ou plusieurs threads).
Comment puis-je utiliser le Flacon à l'intérieur de la classe?
Ma variante avec subfunctions est en train de sucer avec des tests. Je n'ai aucun moyen d'appeler " cmd2 fonction de tests, ce qui laisse une partie du code sans couverture de test (et c'est stupide faute de frappe/traces). Le manque de dépistage pour cette partie du code (subfunctions à l'intérieur de "run") était la principale raison de la question.
OriginalL'auteur George Shuklin | 2016-11-07
Vous devez vous connecter pour publier un commentaire.
Bien que cela fonctionne il ne se sent pas compatible avec la Fiole guide de style. Si vous avez besoin d'envelopper un Flacon d'application à l'intérieur de votre projet, créer une catégorie distincte à vos besoins et ajouter des fonctions qui doivent être exécutées
Des choses à noter ici:
EndpointAction
est censé être un wrapper qui exécutera votre fonction et de générer un vide 200 réponse. Si vous le souhaitez, vous pouvez modifier la fonctionnalité__call__
méthode définielors de l'utilisation de décorateur,je peux consulter les méthodes spécifiques comme
@app.route('/.../',methods=['POST'])
,alors comment dois-je faire cela en classe EndpointAction?C'est excellent
Problème mineur: FlaskAppWrapper.app a été spécifié au niveau de la CLASSE, pas au niveau de l'instance à l'intérieur de __init__(). Chaque instance de la FlaskAppWrapper partagent le même objet application. Si vous deviez créer 2 FlaskAppWrappers avec 2 différents flacon cas, les deux partagent la 2ème en 2ème emporterait sur la 1ère. Pour atténuer ce problème, supprimer
app = None
à partir de ci-dessus __init__. Tout attribut défini dans __init__ sera maintenu au niveau de l'instance. Pas un gros problème ici puisque vous ne serait probablement pas plus d'un FlaskAppWrapper, mais bon de garder à l'esprit en général.OriginalL'auteur Kostas Pelelis
Pour compléter Kostas Pelelis réponse, parce que j'ai eu quelques difficultés à trouver le pourquoi de la Réponse n'a pas directement à l'aide de l'Action valeur de retour.
Voici une autre version de la FIOLE de classe sans décorateurs :
OriginalL'auteur ZettaCircl