2016-11-07 88 views
4

我有許多線程的應用程序。其中之一是燒瓶,用於實施(腋毛)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是大型應用程序的一小部分,它有自己的結構和協議(每個「應用程序」是在一個或多個線程中運行的獨立類)。

如何在課堂內使用Flask?

+1

您是否遇到此代碼的問題?如果是這樣,那是什麼? – dirn

+0

我與子功能的變體吸吮測試。我沒有辦法從測試中調用'cmd2'函數,這會讓部分代碼沒有測試覆蓋率(這會帶來愚蠢的錯誤/痕跡)。對這部分代碼缺乏測試(「運行」內部的子功能)是這個問題的主要原因。 –

回答

6

雖然這可行,但它不符合Flask風格指南。如果你需要用你的項目中的燒瓶中的應用程序,創建一個單獨的類,以您的需求,並補充說,應執行

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

有些東西這裏需要注意的功能:

  • EndpointAction應該是一個將執行你的函數併產生一個空的200響應的包裝器。如果你願意,你可以編輯功能
  • 端點處理器可以是任何東西,有一個__call__方法定義
  • 端點名稱應該是唯一的,因爲它代表一個視圖名稱
  • 申請後添加終點是不可能的,因爲該線程將在應用程序啓動後阻塞。您可以通過在單獨的線程上運行應用程序來啓用它,但不建議在飛行中更改URL映射,既不是線程安全的,也不是線程安全的
+0

謝謝。這比裝飾器不那麼優雅,但與應用程序中的其他代碼一致。 –