繁体   English   中英

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

[英]How to share data between requests in Tornado Web

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

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

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

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

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

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

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

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

我建议如下:代替数据库访问对象传递存储数据的对象,例如:

data = DataStore()

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

使用以下RequestHandler初始化方法。

def initialize(self, data):
     self.data = data

您必须先创建对象并传递它,否则每次处理请求时都会重新创建它。

文档提供了一种方法:

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保存到文件中。

但我不确定这是实现请求之间同步所需的正确方法。

你可以使用memcached的东西。 但是,您需要设置memcached服务器。

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

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM