当我使用 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 中的打印语句中定义
我正在检查应用程序问题:http://code.google.com/p/modwsgi/wiki/ApplicationIssues并发现以下声明。
应用程序全局变量
由于托管 WSGI 应用程序的 Python 子解释器在请求之间保留在内存中,因此任何全局数据实际上都是持久的,并且可用于将状态从一个请求转发到下一个请求。然而,在 UNIX 系统上,Apache 通常会使用多个进程来处理请求,并且每个这样的进程都有自己的全局数据。 这意味着虽然可以使用全局数据,但它只能用于缓存可以在单个进程的上下文中安全重用的数据。您不能使用全局数据作为保存任何请求处理程序都必须可见的信息的方法,无论它在哪个进程中运行。
我必须在类和函数之间传递这些变量。 我尝试将变量附加到内置和网络模块,但它也没有成功。
PS:我也不想将这些变量存储在文件或数据库中。
我希望我已经说清楚了。
最佳答案
开发 Web 应用程序时不应依赖全局变量,因为在某些时候它可能会配置为在不共享这些变量的单独进程中运行。
为了将它们保留在请求之间,您应该从持久存储中保存和加载它们,所以我想如果不使用数据库或类似的解决方案,这是不可能的。
加载和保存它们的一个好方法是使用 application processors这将在 web.ctx 中加载这些变量,以便您可以在 Controller 方法中访问它们。
例如:
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)
关于python - Apache 中 web.py 的全局变量用法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16217322/