我是Python,Mod_WSGI和Bottle的新手。我的主要问题是当使用Mod_WSGI运行进程时,我希望它在初始化时加载一次文件。通过在终端中运行脚本,您只需使用if __name__ == '__main__'
我需要它在初始化时(或首次调用时)加载文件一次,以便对进程的任何后续调用都不需要重新加载文件。我不确定如何做到这一点。
只要有人进入推荐页面,就会运行以下代码
@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)
如何在初始化时执行前4行(涉及解析器的行),这样我只需要在访问推荐页面时调用res.recommend()?
感谢任何帮助, 沫
答案 0 :(得分:2)
对于守护程序模式,将其放在WSGI脚本文件的全局范围内。该文件仅在每个进程中加载一次。这通常是第一个请求映射到该应用程序。
对于emebedded模式,如果修改WSGI脚本文件,则可以在同一进程中重新加载。在这种情况下,如果你愿意,甚至还可以使用守护进程模式,使用单独的脚本文件并使用WSGIImportScript指令强制在进程启动时加载它。
请参阅:
http://code.google.com/p/modwsgi/wiki/ConfigurationDirectives#WSGIImportScript
您需要知道运行WSGI应用程序的进程组/应用程序组是否要将其加载到同一个子解释器中,因此请查看WSGIProcessGroup / WSGIApplicationGroup指令。
答案 1 :(得分:0)
Python模块仅在您第一次加载时运行。
后续调用不会再次运行代码
E.g。
mod.py:
x = 10
print(x)
main.py:
import mod #will print 10
mod.x = 5
import mod #nothing is printed. mod.x == 5
答案 2 :(得分: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方法中解析脚本输入参数只是一种不好的形式。就像把湿鱼留在你同事的办公桌里一样。
相反,请使用包含选项的配置文件并读取配置文件。
对于你们中间的勇敢者,看看a memoizing decorator,把它变成一个缓存留给读者作为练习,因为缓存只是带有过期的记忆。