2016-11-07 11 views
4

私は多くのスレッドでアプリケーションを持っています。それらの1つは、(腋窩)APIを実施するために使用されるフラスコである。それは低負荷で使用され、決してインターネットにさらされないので、ビルドインフラスコのウェブサーバーは完全にうまくいきます。クラス内フラスコを使用

私の現在のコードは次のようになります。

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

私はすべてのドキュメントは、「モジュールレベルでフラスコのアプリを作成する」と言うので、私は、それが悪いことを感じます。しかし、私はこれをやりたいとは思っていません。私のテストではうんざりしています.APIは、独自の構造とアグリーメントを持つ大規模なアプリケーションの一部です(それぞれのアプリケーションは、1つ以上のスレッドで別々のクラスを実行します)。

Flaskをクラス内で使用するにはどうすればよいですか?

+1

このコードに問題がありますか?もしそうなら、それは何ですか? – dirn

+0

サブ関数を持つ私の亜種は、テストで吸います。私はテストから 'cmd2'関数を呼び出す方法がなく、これはテストカバレッジなしでコードの一部を残します(そして、これは愚かな誤字/トレースをもたらします)。コードのこの部分(内部 '実行'のサブ機能)のテストが不足していることが、この主な理由でした。 –

答えて

6

これは動作しますが、Flaskスタイルのガイドには準拠していません。

  • EndpointActionをすることになっている:あなたは、あなたのプロジェクト内のフラスコのアプリケーションをラップニーズに別のクラスを作成し、ここで注意すべきいくつかのものが

    from flask import Flask, Response 
    
    
    class EndpointAction(object): 
    
        def __init__(self, action): 
         self.action = action 
         self.response = Response(status=200, headers={}) 
    
        def __call__(self, *args): 
         self.action() 
         return self.response 
    
    
    class FlaskAppWrapper(object): 
        app = None 
    
        def __init__(self, name): 
         self.app = Flask(name) 
    
        def run(self): 
         self.app.run() 
    
        def add_endpoint(self, endpoint=None, endpoint_name=None, handler=None): 
         self.app.add_url_rule(endpoint, endpoint_name, EndpointAction(handler)) 
    
    
    def action(): 
        # Execute anything 
    
    a = FlaskAppWrapper('wrap') 
    a.add_endpoint(endpoint='/ad', endpoint_name='ad', handler=action) 
    a.run() 
    

    を実行すべき機能を追加する必要がある場合あなたの関数を実行し、空の200応答を生成するラッパー。あなたがしたい場合は、エンドポイントハンドラが__call__メソッドは、アプリケーションが可能な限りではありません後にエンドポイントを追加する

  • ビュー名を表してエンドポイント名は一意である必要があり
  • を定義している何もすることができます機能
  • を編集することができますアプリケーションが起動するとスレッドはブロックされます。別のスレッドでアプリケーションを実行することで有効にできますが、オンザフライでURLマップを変更することは推奨されず、スレッドセーフでもありません。
+0

ありがとうございます。これはデコレータよりもエレガントではありませんが、アプリケーションのコードの残りの部分に沿っています。 –

関連する問題