python - Django、Borg 模式、API 调用、缓存结果

标签 python django api caching

我正在使用来自不同网站的 API,该 API 会返回我的用户用来购买虚拟商品的几个“价格点 URL”。

我应该将这些结果缓存至少一个小时,因为它们不会对系统上的价格点进行太多更改。 (而且我们想节省我们和他们的带宽。)

在 Python 中寻找单例后,我发现了 borg 模式,它看起来更酷,所以这就是我所做的:

def fetchPrices():
    #uses urllib2.urlopen() to fetch prices
    #parses results with ElementTree
    return prices

class PriceStore():
    __shared_state = {}

    def update(self):
        if self.lastUpdate is not None and (datetime.now() - self.lastUpdate).seconds >= 3600:
            self.prices = fetchPrices()
            self.lastUpdate = datetime.now()
        elif self.lastUpdate is not None:
            return
        else:
            self.lastUpdate = datetime.now() - timedelta(hours=1)
            self.update()

    def __init__(self):
        self.__dict__ = self.__shared_state
        self.lastUpdate = None
        self.update()

我们的想法是按以下方式使用它:

store = PriceStore()
url = store.prices['2.9900']['url']

如果现有信息超过一小时,商店应该正确初始化并且只获取新的价格点信息。

不过,每次初始化 PriceStore 时,我似乎都会访问他们的 API。谁能发现我的问题?我可以在 Django 中使用像 __shared_state 这样的全局变量并期望它仍然包含定价信息吗?

谢谢!

最佳答案

I seem to be hitting their API with every time that PriceStore is initialized, though. Can anyone spot my problem?

是的,很容易发现:

def __init__(self):
    self.__dict__ = self.__shared_state
    self.lastUpdate = None

self.lastUpdate = None 绝对保证紧随其后的 self.update() 调用将找到 self。 lastUpdate 的值为 None —— 你只是强制它如此!

删除 __init__ 中的 self.lastUpdate = None,例如,改用 a

lastUpdate = None

类(class)级别,例如就在 __shared_state = {} 赋值之后,并且与该赋值具有相同的对齐方式。 将使事情按您的预期进行。

关于python - Django、Borg 模式、API 调用、缓存结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3357158/

相关文章:

python - django csrf_token 不打印隐藏的输入字段

javascript - 我无法进入嵌套 JSON 对象,但只是有时

用于最小可执行文件的 C++ Windows 编译器

django - 我怎样才能让我的南方迁移发挥作用?

PHP RESTful API 安全

Python的np数组列表到数组

python - cqlengine (Cassandra 2.0) 上的错误时间戳

python - 如何在 TextMate 中为 Python 注释启用 block 折叠?

python - 列上的累计总和和百分比?

python - 字典联合并对另一个字段求​​和