如何在web.py中保持变量值跨请求
我想在每次收到请求时立即更新日志文件。我有一个类变量叫做 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"。