2016-10-04 29 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可以引用同self__init__,由於構成的封閉。

但由於Flask的context locals,保持Flask中物體的狀態並不好。改用會話。

另外,我覺得你追求的是class-based views

相關問題