簡體   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