python web应用程序中的全局变量(flask)

时间:2014-08-23 08:50:56

标签: python web-applications flask

我正在运行跟随我的问题的python web应用程序。当我从命令行运行它一切正常。它调用程序的 main 部分加载xml文件以及随后从/ search / term路径发出的任何请求,我的web应用程序返回正确的值。但是,如果我从apache运行它, main 自然不会被执行。在这种情况下,我可以如何打开文件一次,然后能够对每个请求进行查询?这是否可能,或者我应该将数据加载到数据库以便具有这种持久性?理想情况下,我想避免db调用的复杂性,因为我正在进行简单的字符串搜索操作。 提前致谢(代码如下)

Marinero

from flask import Flask
from classes import History
from xmlReader import xmlReader

app = Flask(__name__)

@app.route('/')
def index():
    return '<h1>Hello World!</h1>'

@app.route('/search/<term>')
def user(term):
    (resultCoords, resultTerms) = historyObj.searchForTerm(term)
    result = "<p>"
    for t in resultTerms:
        result = result + t.string + '<br>' 
    result = result + '</p>'
    return result

if __name__ == '__main__':
    reader = xmlReader("web_history.xml")
    global historyList
    historyList = reader.getData()
    global historyObj
    historyObj = History(historyList)
    app.run()

2 个答案:

答案 0 :(得分:0)

问题当然是当在Apache的reqest上下文中时,存储在app context中的变量将不可用。

以下是Miguel Grinberg关于在request背景下全局提供变量的优秀书籍的代码片段:

@main.app_context_processor
def inject_permissions():
    return dict(Permission=Permission)

所以在你的情况下像

@app.app_context_context_processor
def inject_permissions():
    #return globals here 

然后您应该能够访问请求上下文中应用程序上下文中可用的那些文件。

编辑:会发表评论,但没有足够的代表

对Flask更有经验的人可能更能回答我们的解决方案之间的差异,但我会试一试。

我的实现与您的实现之间唯一明显的区别是代码将自动运行,无论Flask应用程序的上下文如何。这显然是app_context

中不必要的

一旦应用程序变得更复杂(蓝图,不同的配置),也可能存在其他问题,因为变量是在其他任何东西之前定义的,所以我认为修改全局变量将很困难。

编辑2:对第二条评论的回应:我再次看了这本书,是的,这就是他使用的模式背后的原因:

  

为了避免在每个render_template()调用中添加模板参数,可以使用上下文&gt;处理器。上下文处理器使变量全局可用于所有模板。

答案 1 :(得分:0)

回答我自己的问题。 @FoxRocks,我更喜欢你的方法吗?有什么原因?非常感激。对我有用的解决方案是:

from flask import Flask
from classes import History
from xmlReader import xmlReader
from flask.ext.script import Manager

app = Flask(__name__)
manager = Manager(app)
globalString = "hello"
reader = xmlReader("web_history.xml")
global historyList
historyList = reader.getData()
global historyObj
historyObj = History(historyList)

@app.route('/')
def index():
    return '<h1>Hello World!</h1>'

@app.route('/search/<term>')
def user(term):
    (resultCoords, resultTerms) = historyObj.searchForTerm(term)
    result = "<p>"
    for t in resultTerms:
        result = result + t.string + '<br>' 
    result = result + '</p>'
    return result

if __name__ == '__main__':
    manager.run()