当我使用Apache配置web.py代码时遇到了一个奇怪的问题。 我有3个变量,我需要在2个类中使用它。我曾经使用全局变量来处理这个问题,但遗憾的是现在还没有工作。
示例:
urls = (
'/', 'index',
'/result','Result'
)
# index is basically a form which takes some inputs
class index:
def POST(self):
global VAR1, VAR2, VAR3
i = web.input()
VAR1 = i.word1.__str__()
VAR2 = i.word2.__str__()
VAR3 = i.word3.__str__()
raise web.seeother('/result')
class Result:
def GET(self):
print VAR1, VAR2
return r_result(VAR1, VAR2)
def POST(self):
print VAR2, VAR3
当我独立运行代码(即python webappy.py)时,这非常正常,但是当在apache设置中使用时,它会给出:
NameError:全局名称' VAR1'未在Result.Get
中的print语句中定义我正在检查ApplicationIssues:http://code.google.com/p/modwsgi/wiki/ApplicationIssues并找到以下声明。
应用程序全局变量
因为托管WSGI应用程序的Python子解释器在请求之间保留在内存中,所以任何全局数据都是有效持久的,可用于将状态从一个请求传送到下一个请求。但是,在UNIX系统上,Apache通常会使用多个进程来处理请求,每个这样的进程都有自己的全局数据。 这意味着虽然可以使用全局数据,但它只能用于缓存可以在该单个进程的上下文中安全地重用的数据。您无法使用全局数据来保存任何请求处理程序必须可见的信息,无论它在哪个进程中运行。
我必须在类和函数之间传递这些变量。 我尝试将变量附加到 builtin &网络模块,但它也没有锻炼。
PS:我也不想将这些变量存储在文件或db中。
我希望我能说清楚。
答案 0 :(得分:1)
开发Web应用程序时不应该依赖全局变量,因为在某些时候它可能被配置为在不共享这些变量的单独进程中运行。
要在请求之间保留它们,您应该保存并从持久存储中加载它们,所以我想如果不使用数据库或类似解决方案就不可能。
加载和保存它们的好方法是使用application processors将这些变量加载到web.ctx中,以便您可以在控制器方法中访问它们。
例如:
def global_variables_processor(handle):
# load variables from persistent storage and save them in web.ctx.global_variables
try:
return handle()
finally:
# save variables from web.ctx.global_variables in persistent storage
app = web.application(urls, globals()
app.add_processor(global_variables_processor)
答案 1 :(得分:0)
嗯,这个摘录可能有你的问题......
Apache通常会使用多个进程来处理请求和 每个这样的过程都有自己的全局数据。
...所以你的代码只有在你配置apache使用一个永远不会终止的进程时才能可靠地工作...
MaxClients 1
MaxRequestsPerChild 0
如果这不是一个实用的选项,你必须将这些变量存储在其他地方。