如何在Tornado Web中的请求之间共享数据

时间:2012-09-02 22:30:08

标签: python tornado

我的Tornado Web服务器有以下用例:

在POST请求时,可以向服务器输入条目,这些条目不会持久保存到文件或数据库。在GET请求时,可以启动或终止进程。

因此,我需要在RequestHandler实现中的不同请求之间共享数据。这样做的正常方法是什么?

我在将数据保存到self时遇到了困难,例如self.entry = "..."。在另一个请求中,数据不再存在。

我发现唯一可行的解​​决方案是将其存储在应用程序对象中:

    application = web.Application([
            (r'.*', MainHandler,
            ])

    def get(self):
         # ...
         self.application.entry = "..."

这是正确的方法吗?此外,同步在这里,我的意思是这意味着访问共享数据。

4 个答案:

答案 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服务器。

http://pypi.python.org/pypi/python-memcached/

答案 3 :(得分:1)

应用程序是存储(半)持久数据的正确对象。但是,正如其他anwser所建议的那样,您应该考虑使用某种数据库来存储此数据。

但是,您应该注意会话(或事务)没有正确完成(例如,您获得POST但没有GET来触发操作),您应该删除会话数据以免您的网络服务器泄漏记忆。

根据我的经验,我建议使用Redis,因为它易于使用并支持key expiration,这种机制在您需要管理会话数据时非常方便。