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

1 投票
2 回答
3534 浏览
提问于 2025-04-17 02:49

我想在每次收到请求时立即更新日志文件。我有一个类变量叫做 event_logging_enabled,最开始设置为 TRUE。在 POST() 函数里,我会检查这个 event_logging_enabled 的值。

但是在运行时,我把这个标志的值改成 FALSE,以便后续的请求使用。但它依然保持为 TRUE。

在调试的时候,我发现每当收到请求时,都会创建一个新的对象来处理这个请求,所以它会使用初始化时的值,也就是 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

2 个回答

12

我过去做过的一件事情,效果还不错,就是如果我需要一个在所有请求中都能保持不变的变量,我会在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对象上的任何东西,都会在应用重启之前一直保持不变。这有点像小技巧,但确实有效。

3

我对web.py这个框架不是很熟悉,但一般来说,在做网页应用的时候,如果你想在多次请求之间保持状态,就需要用到一个叫做会话对象的东西。这个会话对象可以是每个用户单独的,也可以是整个应用共享的。

在web.py框架中有一个会话对象:http://webpy.org/docs/0.3/api#web.session

它让你可以选择把会话的内容存储在数据库里,还是直接存到文件中。页面上“DiskStore”下面的代码示例展示了如何把一个变量放进会话里。

顺便提一下,在Python中,布尔值是True和False,而不是"True"。

撰写回答