2013-02-13 85 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

相关问题