【问题标题】:How to share data between requests in Tornado Web如何在 Tornado Web 中的请求之间共享数据
【发布时间】:2012-09-02 22:30:08
【问题描述】:

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

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

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

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

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

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

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

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

【问题讨论】:

    标签: python tornado


    【解决方案1】:

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

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

    用下面的RequestHandler初始化方法。

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

    你必须在之前创建对象并传递它,否则每次处理请求都会重新创建它。

    【讨论】:

    • 我不熟悉 Tornado,但请记住,如果您使用多个进程,这可能不起作用。
    • @monkut 多个进程用于什么,服务器,客户端?
    • Tornado 是一个单进程、单线程的服务器……这可以工作。
    • 是的,如果您将其保持在单进程模式,这将起作用。 tornadoweb.org/documentation/httpserver.html
    【解决方案2】:

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

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

    【讨论】:

    • 我不想保留我的数据,我只想在运行时保存它。这里不需要或不需要数据库。
    • 我所说的database 只是你的数据,你可以使用任何类型的数据存储。它允许在运行时保存它。
    【解决方案3】:

    您可以将memcached 用于此类操作。但是,您需要设置 memcached 服务器。

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

    【讨论】:

    • 是不是有点矫枉过正?我只是想在运行应用程序时存储 2 个对象。
    【解决方案4】:

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

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

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

    【讨论】:

    • 为什么要使用数据库来存储我不想持久化的数据?数据应仅在运行 Web 服务器时可用。如果网络服务器崩溃了,数据应该失效。如果必须重新启动 Web 服务器,则数据应失效。
    • 我听到了。在这种情况下,应用程序绝对是要走的路。您可以将会话数据存储在应用程序实例中您喜欢的任何容器中。我的评论只是当/如果您的项目功能增长时,将会话数据存储在第三方存储中可能会越来越有用。例如,考虑应用程序监控:从存储(而不是服务器本身)检索/计算实时会话数据的指标可能很棒,因为它不会干扰/影响您的服务器性能。
    猜你喜欢
    • 2013-12-10
    • 1970-01-01
    • 1970-01-01
    • 2012-01-04
    • 1970-01-01
    • 1970-01-01
    • 2016-01-05
    • 1970-01-01
    • 2022-06-26
    相关资源
    最近更新 更多