Skip to main content
 首页 » 编程设计

python之如何在 web.py 中跨请求保持变量值

2025年05月04日34Renyi-Fan

我想在收到请求后立即更新日志文件。我有一个初始化为 TRUE 的类变量 event_logging_enabled。在 POST() 函数中,我检查了 event_logging_enabled 的值。

现在在运行时,我将此标志的值修改为 FALSE 以用于后续请求。但它仍然是真的。

在调试过程中,我发现当收到请求时,会创建一个新对象来处理每个请求,因此会选择初始化值,即 TRUE。

对于同一个类的 getlogEnabled() 等其他函数,情况并非如此。 您能否提出任何解决方法。

import web 
import threading 
 
class webServer(threading.Thread): 
    port = "1234" 
    event_logging_enabled  = "True" 
 
    def getlogEnabled(self): 
        print "Stub getlogEnabled(): ",self.event_logging_enabled 
 
    def __init__(self): 
        threading.Thread.__init__(self)  
        """ Logging """ 
        print "Init------------------------",self.event_logging_enabled 
        self.event_logging_filename = "ueLogs.log" 
 
    def run(self): 
        urls = ( 
        '/','webServer', 
        ) 
        app = web.application(urls,globals()) 
        sys.argv.append(webServer.port) 
        app.run() 
 
    def POST(self): 
        print "in POST" 
        print "Stub POST(): Logging Enabled : ",self.event_logging_enabled 

请您参考如下方法:

我过去所做的并且似乎工作正常的是,如果我需要一个在所有请求中都保持不变的变量,我会在 app.run() 之前将它添加到 Web 对象上

例如,如果我想要一个名为“foo”的变量,它在所有请求中共享并且在请求之间保持不变,我会这样做

web.app = web.application(urls, globals()) 
 
# Add my custom foo 
web.foo = 'some value' 
 
# Start the app 
web.app.run() 

然后,如果我需要修改或使用 foo 变量,在我的代码中的某个地方,我将

import web 
 
web.foo = 'some other value' 

在启动脚本中添加到 Web 对象上的任何内容都将持续存在,直到应用程序重新启动。有点 hack,但它有效。