我的Tornado Web服务器有以下用例:
在POST请求时,可以向服务器输入条目,这些条目不会持久保存到文件或数据库。在GET请求时,可以启动或终止进程。
因此,我需要在RequestHandler
实现中的不同请求之间共享数据。这样做的正常方法是什么?
我在将数据保存到self
时遇到了困难,例如self.entry = "..."
。在另一个请求中,数据不再存在。
我发现唯一可行的解决方案是将其存储在应用程序对象中:
application = web.Application([
(r'.*', MainHandler,
])
和
def get(self):
# ...
self.application.entry = "..."
这是正确的方法吗?此外,同步在这里,我的意思是这意味着访问共享数据。
答案 0 :(得分:15)
我建议如下:代替数据库访问对象传递存储数据的对象,例如:
data = DataStore()
application = web.Application([
(r'.*', MainHandler, dict(data = data),
])
使用以下RequestHandler
初始化方法。
def initialize(self, data):
self.data = data
您必须先创建对象并传递它,否则每次处理请求时都会重新创建它。
答案 1 :(得分:7)
documentation提供了一种方法:
class MyHandler(RequestHandler):
def initialize(self, database):
self.database = database
def get(self, username):
...
mydatabase = dict()
app = Application([
(r'/user/(.*)', MyHandler, dict(database=mydatabase)),
])
然后,您可以将对象mydatabase
保存到文件中。
但我不确定这是否是实现请求之间同步所需的正确方法。
答案 2 :(得分:1)
你可以使用memcached
来做这样的事情。但是,您需要设置memcached服务器。
答案 3 :(得分:1)
应用程序是存储(半)持久数据的正确对象。但是,正如其他anwser所建议的那样,您应该考虑使用某种数据库来存储此数据。
但是,您应该注意会话(或事务)没有正确完成(例如,您获得POST但没有GET来触发操作),您应该删除会话数据以免您的网络服务器泄漏记忆。
根据我的经验,我建议使用Redis,因为它易于使用并支持key expiration,这种机制在您需要管理会话数据时非常方便。