2016-10-04 10 views
0

それはFlaskをサブクラス化することが可能です:Flaskでルートを持つメソッドをマークすることはできますか?

from flask import Flask 

class MyServer(Flask): 
    def __init__(self, *args, **kwargs): 
     super().__init__(*args, **kwargs) 

    def my_cool_method(self): 
     print("About to do some crazy productive work!") 

このようにすることで、一つはMyServerオブジェクトを作成し、ヒットが、メソッドを呼び出して、ルートを定義することができます。

my_server = MyServer(__name__) 

@my_server.route("/my_cool_endpoint") 
def my_cool_endpoint(): 
    my_server.my_cool_method() 

この一見不必要な(とかなり持続不可能な)ステップを切り出し、単にルートに方法を飾るためにすべての可能な方法はありますか?

私の擬似コードは次のように...

#!/usr/bin/env python3 

from flask import Flask 

class MyServer(Flask): 
    def __init__(self, *args, **kwargs): 
     super().__init__(*args, **kwargs) 

    @self.route("/my_cool_endpoint") 
    def my_cool_method(self): 
     print("About to do some crazy productive work!") 

if __name__ == "__main__": 
    my_server = MyServer(__name__) 
    # We can now hit 127.0.0.1:8080/my_cool_endpoint... hopefully 
    my_server.run(port=8080) 

私のモチベーションは、単にrunオブジェクトおよびエンドポイントは、各APIの呼び出しにオブジェクトの状態を変更し、ヒットを取得してみましょうあるものになるだろう。

これは私が説明したように正確ではない場合は、私の目標を達成するための最小の攻撃方法は何ですか?

+1

シーク何だと思うが、それは理解することはちょっと難しいです。シンプルなコントローラーがなぜあなたのために機能しないのですか? –

+1

これを行わないでください。人々がこのパターンをどこから得ているのかは分かりませんが、それは意味がありません。あなたは工場のパターンを探しています。 – davidism

+0

@davidism私はあなたが正しいと確信していますが、自分の問題に工場パターンを適用する方法がわかりません。私の質問から外挿するようです。私は、ユーザーが 'MyServer'をサブクラス化したライブラリを作成したいと思っています。ファクトリパターンは実際にはここでは使用できません(私が見る限り)。 – erip

答えて

0

routeFlaskクラスのメソッドなので、実際に(あなたが@app.routeを行う際に渡される)最初の引数として、アプリのインスタンスを必要とします。クラスのすべてのメソッド(装飾されているかどうか)はコンパイル時に評価されるため、記述する方法ではできません(または深刻な魔法を必要とするかもしれません)。あなたは、常に行うことができます。

class MyApp(Flask): 
    def __init__(self, *args, **kwargs): 
     self.count = 0 
     super(MyApp, self).__init__(*args, **kwargs) 

     @self.route('/') 
     def index(): 
      self.count += 1 
      print self.count 
      return 'foo' 

selfが形成されて閉鎖に伴う、__init__と同じselfを参照することができます。

しかし、Flaskのオブジェクトの状態を維持することは、Flaskのcontext localsのためにはあまり良くありません。代わりにセッションを使用してください。

はまた、私はあなたが私は申し訳ありませんclass-based views

関連する問題