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

Rev*_*oon 11 python tornado

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

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

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

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

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

    application = web.Application([
            (r'.*', MainHandler,
            ])
Run Code Online (Sandbox Code Playgroud)

    def get(self):
         # ...
         self.application.entry = "..."
Run Code Online (Sandbox Code Playgroud)

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

Kon*_*che 15

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

data = DataStore()

application = web.Application([
        (r'.*', MainHandler, dict(data = data),
        ])
Run Code Online (Sandbox Code Playgroud)

使用以下RequestHandler初始化方法.

def initialize(self, data):
     self.data = data
Run Code Online (Sandbox Code Playgroud)

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

  • 我不熟悉龙卷风,但请记住,如果您使用多个流程,这可能不会起作用. (3认同)
  • 是的,如果你将它保持在单点处理模式,这将有效.http://www.tornadoweb.org/documentation/httpserver.html (3认同)
  • Tornado是一个单进程,单线程服务器...这将工作. (2认同)

pin*_*och 7

文档提供了一种方法:

class MyHandler(RequestHandler):
    def initialize(self, database):
        self.database = database

    def get(self, username):
        ...

mydatabase = dict()

app = Application([
    (r'/user/(.*)', MyHandler, dict(database=mydatabase)),
    ])
Run Code Online (Sandbox Code Playgroud)

然后,您可以将对象保存mydatabase到文件中.

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