91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

基于Django統計博客文章閱讀量

發布時間:2020-08-20 21:10:37 來源:腳本之家 閱讀:175 作者:削微寒 欄目:開發技術

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

增加新字段

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

blog/models.py

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

注意 views 字段的類型為 PositiveIntegerField,該類型的值只允許為正整數或 0,因為閱讀量不可能為負值。初始化時 views 的值為 0。將 editable 參數設為 False 將不允許通過 django admin 后臺編輯此字段的內容。因為閱讀量應該根據被訪問次數統計,而不應該人為修改。

增加模型方法

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

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 方法首先將自身對應的 views 字段的值 +1(此時數據庫中的值還沒變),然后調用 save 方法將更改后的值保存到數據庫。注意這里使用了 update_fields 參數來告訴 Django 只更新數據庫中 views 字段的值,以提高效率。

你也許擔心如果兩個人同時訪問一篇文章,更改數據庫中的閱讀量字段的值時會不會沖突?其實不必擔心,我們本來就不是精確地統計閱讀量,而且個人博客的流量通常也不會很大,所以偶爾的沖突導致的數據誤差是可以忽略不計的。

遷移數據庫

一旦更改了模型,就需要遷移數據庫,以便讓 Django 將更改反應到數據庫中。在項目根目錄運行如下兩條命令:

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

關于數據庫的遷移,具體可以參考 Django 遷移、操作數據庫。

修改視圖函數

當用戶請求訪問某篇文章時,處理該請求的視圖函數為 detail 。一旦該視圖函數被調用,說明文章被訪問了一次,因此我們修改 detail 視圖函數,讓被訪問的文章在視圖函數被調用時閱讀量 +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})

即只需在視圖函數中調用模型的 increase_views 方法即可。

在模板中顯示閱讀量

在模板中顯示閱讀量和顯示其它字段一樣,只需要使用模板變量即可。即模板適當的地方使用 {{ post.views }} 模板變量。這里我們分別修改兩個地方,分別是 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>

好了,這樣當用戶每訪問一次文章詳情,views 記錄的數值就會 +1,從而達到粗略統計閱讀量的目的。

示例代碼

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持億速云。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

家居| 花莲县| 屏东县| 普安县| 昆明市| 榕江县| 武平县| 珲春市| 镶黄旗| 芒康县| 韶山市| 铜山县| 白朗县| 泰来县| 拉萨市| 广灵县| 乐陵市| 黄龙县| 平罗县| 穆棱市| 千阳县| 桃园县| 呼图壁县| 蕲春县| 和平区| 明水县| 新郑市| 平舆县| 安丘市| 黄梅县| 武宁县| 莱州市| 宝应县| 遵化市| 延安市| 民权县| 上犹县| 金昌市| 阿图什市| 凌云县| 宁安市|