我是 Django 新手。我正在制作一个粗略的点击计数器作为大学网络编程类(class)的作业。我做了一个HitCount类:
from django.db import models
# Create your models here.
class HitCount(models.Model):
count = models.IntegerField()
然后我在 View 文件中使用此代码:
def index(request):
#try getting a hitcounter, if there is none, create one
try:
hc = HitCount.objects.get(pk=1)
except:
hc = HitCount(count=0)
hc.save()
pass
#get a queryset containing our counter
hc = HitCount.objects.filter(pk=1)
#increment its count and update it in db
hc.update(count=F('count')+1)
#ATM hc is a queryset, so hc.count will just return how many
#counters are in the queryset (1). So we have to get the
#actual counter object
hc = HitCount.objects.get(pk=1)
#and return its count
return render_to_response('hitcount/index.html', {'count': hc.count})
这是我的index.html 文件:
<p>{{count}}</p>
这似乎工作得很好,但我想知道:
- 这是一种合理的做法吗?增量代码真的应该驻留在 View 文件中吗?或者我应该将其移至类中的方法中?
- 这种并发安全吗?还是需要使用某种锁?任务的一部分是确保计数器并发安全。我使用 SQLite,它使用事务,所以我认为应该没问题,但我可能遗漏了一些东西。
最佳答案
偏离主题,但您应该在 try/except 中捕获 HitCount.DoesNotExist
,因为您实际上只想在 HitCount 对象尚不存在时执行 except 中的代码。
如果可能的话,您可能想查看类似 Redis 的内容(或另一个键/值存储)来执行您的点击计数器。
Redis提供了一个名为 INCR 的方法它会自动将值增加 1。它速度超快,对于像这样的点击计数器来说是一个很好的解决方案。您需要做的就是创建一个与页面相关的 key ,并且可以将其增加 +1。
使用middleware也可能更有意义。类来跟踪页面点击率。比将其添加到每个 View 要容易得多。如果您需要在每个页面上显示此计数,您可以使用 context processor ( more info ) 将页面的点击计数添加到上下文中。这样可以减少代码重复。
编辑
我最初错过了这是一个 Uni 项目,所以这可能严重超出了您所需要的工程范围。但是,如果您要为生产环境构建点击计数器,那么我建议您这样做。您仍然可以使用中间件/上下文处理器以 DRY 方式进行命中计数/检索。
关于python - Django 页面点击计数器并发,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7227123/