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

Python 如何在Tornado Web中的请求之间共享数据,python,tornado,Python,Tornado,我的Tornado web服务器有以下用例: 在POST请求时,可以向服务器创建条目,这些条目不会持久化到文件或数据库。在GET请求时,可以启动或终止进程 因此,我需要在我的RequestHandler实现中的不同请求之间共享数据。通常的做法是什么 我很难将数据保存到self,例如self.entry=“…”。在另一个请求中,数据不再存在 我找到的唯一有效解决方案是将其存储在应用程序对象中: application = web.Application([ (r'.

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

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

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

我很难将数据保存到
self
,例如
self.entry=“…”
。在另一个请求中,数据不再存在

我找到的唯一有效解决方案是将其存储在应用程序对象中:

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


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

您可以使用
memcached
实现类似的功能。但是,您需要设置memcached服务器


应用程序是存储(半)持久数据的正确对象。但是,正如其他ANWSER所建议的,您应该考虑使用某种数据库来存储这些数据。 但是,您应该注意,如果会话(或事务)没有正确完成(例如,您收到一个POST,但没有得到触发操作的get),您应该删除会话数据,以免Web服务器泄漏内存

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

提供了一种方法:

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


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

我建议如下:不使用数据库访问对象,而是传递存储数据的对象,例如:

data = DataStore()

application = web.Application([
        (r'.*', MainHandler, dict(data = data),
        ])
使用以下
RequestHandler
初始化方法

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

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

为什么要使用数据库来存储我不想保留的数据?数据应仅在运行web服务器时可用。如果web服务器崩溃是,则数据应无效。如果必须重新启动web服务器,是的,数据应该无效。我听到了。在这种情况下,应用程序无疑是一种方法。您可以将会话数据存储在应用程序实例中您喜欢的任何容器中。我的意见是,当/如果您的项目功能增加时,将会话数据存储在第三方存储中可能会越来越有用。例如,考虑一下应用程序监控:在不干扰/影响服务器性能的情况下,从存储(而不是服务器本身)检索/计算实时会话数据的指标可能会很好。这不是有点过分吗?我只想在应用程序运行时存储2个对象。我不想持久保存数据,我只想在运行时保存数据。这里不需要或不需要数据库。我称之为
数据库
只是您的数据,您可以使用任何类型的数据存储。它允许在运行时保存它。我不熟悉Tornado,但请记住,如果您使用多个进程,这可能不起作用。@monkut多个进程用于什么,服务器,客户端?Tornado是一个单进程,单线程服务器。。。这将起作用。是的,如果您将其保持在单流程模式,这将起作用。
def initialize(self, data):
     self.data = data