我正在使用来自不同网站的 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/