我有一个很大的Django项目,其中包含几个相互关联的项目和大量的缓存.它目前有一个存储缓存辅助函数的文件.因此,例如,get_object_x(id)将检查此对象的缓存,如果它不存在,请转到数据库并从那里拉出并返回它,沿途缓存它.遵循相同的模式来缓存对象组,该文件也用于失效方法.
虽然应用程序之间的导入出现了问题.应用程序模型文件有许多我们想要使用缓存的辅助函数,而cache_helpers文件显然需要导入模型文件.
所以我的问题是:有什么更好的方法可以将代码暴露给循环导入问题(或者通常只是一种更聪明的方式)?理想情况下,我们也可以以更好,更少手动的方式进行失效.我的猜测是使用Django Custom Managers和Signals是最好的起点,完全摆脱cache_helpers文件,但是有没有人有更好的建议或指示去哪里看?
用于避免循环导入的一般Python模式是将一组导入放在依赖函数中:
# module_a.py import module_b def foo(): return "bar" def bar(): return module_b.baz() # module_b.py def baz(): import module_a return module_a.foo()
至于缓存,听起来你需要一个看起来像这样的函数:
def get_cached(model, **kwargs): timeout = kwargs.pop('timeout', 60 * 60) key = '%s:%s' % (model, kwargs) result = cache.get(key) if result is None: result = model.objects.get(**kwargs) cache.set(key, result, timeout) return result
现在您不需要为每个模型创建"getbyid"方法.你可以这样做:
blog_entry = get_cached(BlogEntry, pk = 4)
您可以使用.get()方法编写类似的函数来处理完整的QuerySet而不是单个模型对象.