【问题标题】:Where do I place this hit counter incrementer code?我在哪里放置这个命中计数器增量代码?
【发布时间】:2010-06-21 03:04:42
【问题描述】:

摘自this question

from django.db.models import F
...
MyModel.objects.filter(id=...).update(hit_count=F(hit_count)+1)

建议放入中间件,我在middleware 上阅读了一些内容,但如果有人能指出他们在这种情况下会做什么,将不胜感激。以我的Bug 模型为例,它有一个独特的 slug 字段和 pk。

这是我的模型:

class Bug( models.Model ):
    name = models.CharField( max_length=100 )
    slug = models.SlugField(unique=True)
    excerpt = models.TextField()
    excerpt_markdown = models.TextField( editable=False, blank=True )
    summary = models.TextField()
    summary_markdown = models.TextField(editable=False, blank=True)
    #workaround = models.TextField()
    #workaround_markdown = models.TextField(editable=False, blank=True)
    date_added = models.DateTimeField()
    poster = models.ForeignKey(User)
    tags_string = TagField()

    class Meta:
    ordering = ['name']

    def __unicode__(self):
    return self.name

    def get_absolute_url(self):
    return '/bugs/%s/' % self.slug

    def save( self, force_insert=False, force_update=False ):
    self.summary_markdown = markdown(  self.summary  )
    self.excerpt_markdown = markdown ( self.excerpt )
    #self.workaround_markdown = markdown(  self.workaround )
    super( Bug, self ).save( force_insert, force_update )

通过/bugs/(slug)查看链接。我还没有添加新列,但我想它只是hit_counter = models.IntegerField()

【问题讨论】:

    标签: django middleware


    【解决方案1】:

    您有三个选择:

    1. 将代码放在中间件中,以便通过 RequestContext 在您的模板中通用。

    2. 将代码放在装饰器中(本质上只是一个包装另一个函数并添加一些功能的 python 函数),以便您可以决定要在何处应用此“命中计数”代码。

    3. 将代码放在自定义模板标签中,每次呈现带有标签的模板时,计数器都会递增。

    选项三(模板标签)是最复杂的,但最适合实际用途,因为它可以在一段代码中渲染计数器并递增它。选项 1(中间件)是最简单的,但也是最不灵活/可重用的,等等。

    中间件和模板标签都在 Django 的文档中有很好的记录。与在 SO 上获得代码 sn-p 相比,您将通过它们获得更多。

    装饰器是 Python v2.4 以来的基本部分,值得学习,但不是我在这里选择的解决方案。它们是一个强大的工具,Google 搜索(甚至是 SO 上的搜索)将为您提供大量信息。

    【讨论】:

    • 选项三并不适合这个目的,因为模板被缓存了。代码应该存在于 BugManager 类中,但可能在视图周围的装饰器中或仅在视图的开头调用。
    【解决方案2】:

    可能值得指出的是,如果您在每次用户查看模型时保存模型,这将使​​大多数缓存变得毫无意义,因为模型将比任何缓存都更新。

    如果这对您很重要,您可能需要考虑一种保留缓存的方法 - 例如,改为在每个视图上更新一个单独的 Hits 模型,然后以缓存友好的间隔将这些命中计数折叠回主模型。

    【讨论】:

      【解决方案3】:

      我更喜欢将它放在装饰器中并装饰访问此模型的所有视图

      【讨论】:

      • 当你提到装饰器时,我不确定你在说什么——你能举个例子吗?
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-08-02
      • 2014-02-27
      • 1970-01-01
      • 2015-10-31
      • 1970-01-01
      相关资源
      最近更新 更多