Jef*_*eff 4 python django memcached
我有一个很大的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()
Run Code Online (Sandbox Code Playgroud)
至于缓存,听起来你需要一个看起来像这样的函数:
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
Run Code Online (Sandbox Code Playgroud)
现在您不需要为每个模型创建"getbyid"方法.你可以这样做:
blog_entry = get_cached(BlogEntry, pk = 4)
Run Code Online (Sandbox Code Playgroud)
您可以使用.get()方法编写类似的函数来处理完整的QuerySet而不是单个模型对象.
| 归档时间: |
|
| 查看次数: |
947 次 |
| 最近记录: |