1

当我使用 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 的打印语句中定义

我正在检查 ApplicationIssues:http ://code.google.com/p/modwsgi/wiki/ApplicationIssues并发现了以下声明。

应用程序全局变量

因为托管 WSGI 应用程序的 Python 子解释器在请求之间保留在内存中,所以任何全局数据都是有效的持久性,并且可以用于将状态从一个请求传递到下一个请求。然而,在 UNIX 系统上,Apache 通常会使用多个进程来处理请求,并且每个这样的进程都有自己的全局数据。这意味着虽然可以使用全局数据,但它只能用于缓存可以在该单个进程的上下文中安全重用的数据。您不能使用全局数据作为保存任何请求处理程序必须可见的信息的手段,无论它在哪个进程中运行。

我必须在类和函数之间传递这些变量。我尝试将变量附加到内置和网络模块,但它也没有锻炼。

PS:我也不想将这些变量存储在文件或数据库中。

我希望我说清楚了。

4

2 回答 2

1

开发 Web 应用程序时不应该依赖全局变量,因为在某些时候它可能被配置为在不会共享这些变量的单独进程中运行。

为了让它们保持在请求之间,您应该从持久存储中保存和加载它们,所以我猜如果不使用数据库或类似的解决方案是不可能的。

加载和保存它们的一个好方法是使用应用程序处理器,它将这些变量加载到 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)
于 2013-04-26T11:10:23.517 回答
0

好吧,您的问题的摘录中有一个可能的原因...

Apache 通常会使用多个进程来处理请求,并且每个这样的进程都有自己的全局数据。

...因此,如果您已将 apache 配置为使用永不终止的单个进程,并且指令...

MaxClients 1
MaxRequestsPerChild 0

如果这不是一个实际的选择,您将不得不将这些变量存储在其他地方。

于 2013-04-25T14:35:37.137 回答