3

I am pretty new to Python, Mod_WSGI and Bottle. My main problem is that when the process is run using Mod_WSGI I want it to load a file once on initialization. With running a script in terminal you would just use if __name__ == '__main__'

I need it to load the file once on initialization (or when first called) so that any subsequent calls to the process does not require the file to be reloaded. I am unsure of how to do this.

The following code is run whenever someone goes to the recommend page

@route('/recommend')
def recommend():
    parser = OptionParser(usage="usage: %prog [options]")
    parser.add_option('-f', '--file', default='data.csv', help='Specify csv file to read item data from.')
    parser.add_option('-D', '--debug', action='store_true', dest='debug', help='Put bottle in debug mode.')
    (options, args) = parser.parse_args()
    return res.recommend(request)

How do I do the first 4 lines (ones involving parser) just on initialization so that I just need to call the res.recommend() whenever the recommend page is accessed?

Any help is appreciated, Mo

4

3 回答 3

2

对于守护程序模式,将其放在 WSGI 脚本文件中的全局范围内。该文件每个进程仅加载一次。这通常是在映射到该应用程序的第一个请求上。

对于嵌入式模式,如果您修改 WSGI 脚本文件,它可以在同一进程中再次重新加载。在这种情况下,如果您愿意,即使是守护程序模式,也可以使用单独的脚本文件并使用 WSGIImportScript 指令在进程启动时强制加载它。

看:

http://code.google.com/p/modwsgi/wiki/ConfigurationDirectives#WSGIImportScript

您需要知道您的 WSGI 应用程序在哪个进程组/应用程序组中运行,以便将其加载到同一个子解释器中,因此还要查看 WSGIProcessGroup/WSGIApplicationGroup 指令。

于 2011-06-03T03:10:11.217 回答
0

Python 模块仅在您第一次加载它们时运行。

后续调用不会再次运行代码

例如

模组.py:

x = 10
print(x)

主要.py:

import mod #will print 10
mod.x = 5
import mod #nothing is printed. mod.x == 5
于 2011-06-03T00:33:44.043 回答
0

您实际上在谈论的是缓存文件读取的结果。

我们将保持简单:

datacache = None

@route("/someroute")
def someroute():
    if not datacache:
        datacache = do_something_clever_with_file(open("filename"))
    page = make_page_from_data(datacache)
    return page

此外,在 Web 方法中解析脚本输入参数也是一种糟糕的形式。类似于在同事的办公桌内留下一条湿鱼。

相反,有一个带有选项的配置文件并读取配置文件。

对于你们当中更勇敢的人,看看memoizing decorator,把它变成一个缓存留给读者作为练习,因为缓存只是过期的记忆。

于 2012-03-14T20:55:48.173 回答