2013-02-13 81 views
8

我對如何以正確的方式將對象傳遞給燒瓶應用程序存在疑問。將另一個對象傳遞給主燒瓶應用程序

這個想法很簡單。

我想爲我的應用程序創建一個API,這意味着由我的燒瓶應用程序處理的http請求將在我的主應用程序中觸發meothds。爲此,我需要燒瓶以這種或那種方式瞭解我的其他過程。

目前,我有這樣的:

if __name__ == '__main__': 
    Logger = MyProcess() 
    app.run() 

我需要能夠做這樣的事情:

@app.route('/nb_trendy') 
def nb_trendy(): 

    res = Logger.get_trendy() 
    return jsonify(res) 

這意味着,我要麼需要要麼放棄對記錄器的句柄應用程序,或直接在應用程序中定義記錄器。

但在每一個解決方案,我可以找到的,我需要創建一個繼承應用程序,要麼覆蓋__init__(),並採取對象作爲參數,或修改run()方法。

當前的方式我會做到這一點是雖然:

class MyFlask(Flask): 
    def __init__(): 
     Flask.__init__() 
     Logger = MyProcess() 

這是還你會做的方式,還是有更好的方法來做到這一點?

謝謝!

下面是這個問題的一個更普遍的版本:Web API in Flask

回答

10

application factories看看,這應該做你要找的東西。你會創建一個工廠,返回的瓶的應用程序,你會發送記錄儀 - 這樣的事情:

def create_app(logger_instance): 
    app = Flask(__name__) 
    app.config['LOGGER'] = logger_instance 
    return app 

,然後在runserver.py,你會創建並傳遞記錄:

from yourapp import create_app 
if __name__ == '__main__': 
    logger = MyProcess() 
    app = create_app(logger) 
    app.run() 

一旦完成,您的應用程序可以引用app.config['LOGGER']內部的記錄器。

1

您可能需要使用燒瓶應用程序上下文從阿明在這

from flask import _app_ctx_stack 

def getLogger(): 
    appContext = _app_ctx_stack.top 
    logger = getattr(appContext, "Logger", None) 
    if logger is None: 
     logger = MyProcess() 
     appContext.Logger = logger 
    return logger 

.... 

@app.route('/nb_trendy') 
def nb_trendy(): 
    logger = getLogger() 
    res = logger.get_trendy() 
    return jsonify(res) 

更深入的瞭解:https://speakerdeck.com/mitsuhiko/advanced-flask-patterns

相關問題