我试图在Django中以原子方式递增一个简单的计数器.我的代码看起来像这样:
from models import Counter
from django.db import transaction
@transaction.commit_on_success
def increment_counter(name):
counter = Counter.objects.get_or_create(name = name)[0]
counter.count += 1
counter.save()
Run Code Online (Sandbox Code Playgroud)
如果我正确理解Django,这应该将函数包装在事务中并使增量原子化.但它不起作用,并且在计数器更新中存在竞争条件.如何使这些代码成为线程安全的?
我确信有人在那里有一个可插拔的应用程序(或教程)近似于此,但我找不到它:我希望能够跟踪特定对象的"视图"数量(就像这里的问题一样)在stackoverflow上有一个"查看计数").
如果用户未登录,我不介意尝试放置cookie(或记录IP),以便他们不会通过刷新页面而无意中运行视图计数; 如果用户已登录,则只允许他们跨会话/浏览器/ IP地址进行一次"查看".我认为我不需要任何比这更好的东西.
我认为最好的方法是使用与我想要跟踪的各种模型分离并使用F表达式(各种类型)的中间件 - 其他关于stackoverlow的问题已提到这个(1)(2)(3) .
但是我想知道这个代码是否已经存在于野外 - 因为我不是最精明的编码器,我相信有人可以做得更好.微笑.
你看到了吗?