python - Django 页面点击计数器并发

标签 python django concurrency auto-increment

我是 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/

相关文章:

python - 如何创建具有某些特定值行为的字典

python - 存储为 Oracle BLOB : python retrieve fails 的 Protocol Buffer

python - 如何从数据库生日字段和 date.today() 计算确切的年龄?

python - numpy.loadtxt 比 open.....readlines() 慢得多

python - 通过二级模型关系进行注释

java - 使用 JTA 隔离分布式(全局)事务

django - 如何在模板中调用模型方法

django - 在Django中获取模型实例的FileField的绝对文件路径

c - 如何避免信号处理程序中的竞争条件

java - 这是没有被破坏的双重检查锁定吗?