欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

基于Django統(tǒng)計(jì)博客文章閱讀量

 更新時(shí)間:2019年10月29日 14:31:28   作者:削微寒  
這篇文章主要介紹了基于Django統(tǒng)計(jì)博客文章閱讀量,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下

如何精確地記錄一篇文章的閱讀量是一個(gè)比較復(fù)雜的問題,不過對(duì)于我們的博客來說,沒有必要記錄的那么精確。因此我們使用一種簡(jiǎn)單但有效的方式來記錄博客文章的閱讀量:文章每被瀏覽一次,則其閱讀量 +1,即所謂的文章頁(yè)面 PV(Page View)數(shù)。雖然簡(jiǎn)單粗暴,但卻高效實(shí)用。

增加新字段

為了記錄文章的瀏覽量,需要在文章的數(shù)據(jù)庫(kù)表中新增一個(gè)用于存儲(chǔ)閱讀量的字段。因此給博客文章的模型新增一個(gè) views 字段:

blog/models.py

class Post(models.Model):
  # ... 其它已有字段
  # 新增 views 字段記錄閱讀量
  views = models.PositiveIntegerField(default=0, editable=False)

注意 views 字段的類型為 PositiveIntegerField,該類型的值只允許為正整數(shù)或 0,因?yàn)殚喿x量不可能為負(fù)值。初始化時(shí) views 的值為 0。將 editable 參數(shù)設(shè)為 False 將不允許通過 django admin 后臺(tái)編輯此字段的內(nèi)容。因?yàn)殚喿x量應(yīng)該根據(jù)被訪問次數(shù)統(tǒng)計(jì),而不應(yīng)該人為修改。

增加模型方法

一旦用戶訪問了某篇文章,這時(shí)就應(yīng)該將 views 的值 +1,這個(gè)過程最好由 Post 模型自己來完成,因此再給模型添加一個(gè)自定義的方法:

blog/models.py

class Post(models.Model):
  # ... 其它已有字段
  # 新增 views 字段記錄閱讀量
  views = models.PositiveIntegerField(default=0)  
  # ... 其它已有的模型方法
  def increase_views(self):
    self.views += 1
    self.save(update_fields=['views'])

increase_views 方法首先將自身對(duì)應(yīng)的 views 字段的值 +1(此時(shí)數(shù)據(jù)庫(kù)中的值還沒變),然后調(diào)用 save 方法將更改后的值保存到數(shù)據(jù)庫(kù)。注意這里使用了 update_fields 參數(shù)來告訴 Django 只更新數(shù)據(jù)庫(kù)中 views 字段的值,以提高效率。

你也許擔(dān)心如果兩個(gè)人同時(shí)訪問一篇文章,更改數(shù)據(jù)庫(kù)中的閱讀量字段的值時(shí)會(huì)不會(huì)沖突?其實(shí)不必?fù)?dān)心,我們本來就不是精確地統(tǒng)計(jì)閱讀量,而且個(gè)人博客的流量通常也不會(huì)很大,所以偶爾的沖突導(dǎo)致的數(shù)據(jù)誤差是可以忽略不計(jì)的。

遷移數(shù)據(jù)庫(kù)

一旦更改了模型,就需要遷移數(shù)據(jù)庫(kù),以便讓 Django 將更改反應(yīng)到數(shù)據(jù)庫(kù)中。在項(xiàng)目根目錄運(yùn)行如下兩條命令:

$ pipenv run python manage.py makemigrations
$ pipenv run python manage.py migrate

關(guān)于數(shù)據(jù)庫(kù)的遷移,具體可以參考 Django 遷移、操作數(shù)據(jù)庫(kù)。

修改視圖函數(shù)

當(dāng)用戶請(qǐng)求訪問某篇文章時(shí),處理該請(qǐng)求的視圖函數(shù)為 detail 。一旦該視圖函數(shù)被調(diào)用,說明文章被訪問了一次,因此我們修改 detail 視圖函數(shù),讓被訪問的文章在視圖函數(shù)被調(diào)用時(shí)閱讀量 +1。

blog/views.py

def detail(request, pk):
  post = get_object_or_404(Post, pk=pk)
  
  # 閱讀量 +1
  post.increase_views()

  md = markdown.Markdown(extensions=[
    'markdown.extensions.extra',
    'markdown.extensions.codehilite',
    # 記得在頂部引入 TocExtension 和 slugify
    TocExtension(slugify=slugify),
  ])
  post.body = md.convert(post.body)

  m = re.search(r'<div class="toc">\s*<ul>(.*)</ul>\s*</div>', md.toc, re.S)
  post.toc = m.group(1) if m is not None else ''

  return render(request, 'blog/detail.html', context={'post': post})

即只需在視圖函數(shù)中調(diào)用模型的 increase_views 方法即可。

在模板中顯示閱讀量

在模板中顯示閱讀量和顯示其它字段一樣,只需要使用模板變量即可。即模板適當(dāng)?shù)牡胤绞褂?{{ post.views }} 模板變量。這里我們分別修改兩個(gè)地方,分別是 index.html 和 detail.html。

templates/blog/index.html

<div class="entry-meta">
 ...
 <span class="views-count"><a href="{{ post.get_absolute_url }}" rel="external nofollow" >{{ post.views }} 閱讀</a></span>
</div>

templates/blog/detail.html

<div class="entry-meta">
 ...
 <span class="views-count"><a href="#" rel="external nofollow" >{{ post.views }} 閱讀</a></span>
</div>

好了,這樣當(dāng)用戶每訪問一次文章詳情,views 記錄的數(shù)值就會(huì) +1,從而達(dá)到粗略統(tǒng)計(jì)閱讀量的目的。

示例代碼

以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

最新評(píng)論