基于Django統(tǒng)計(jì)博客文章閱讀量
如何精確地記錄一篇文章的閱讀量是一個(gè)比較復(fù)雜的問(wèn)題,不過(guò)對(duì)于我們的博客來(lái)說(shuō),沒(méi)有必要記錄的那么精確。因此我們使用一種簡(jiǎn)單但有效的方式來(lái)記錄博客文章的閱讀量:文章每被瀏覽一次,則其閱讀量 +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 將不允許通過(guò) django admin 后臺(tái)編輯此字段的內(nèi)容。因?yàn)殚喿x量應(yīng)該根據(jù)被訪問(wèn)次數(shù)統(tǒng)計(jì),而不應(yīng)該人為修改。
增加模型方法
一旦用戶訪問(wèn)了某篇文章,這時(shí)就應(yīng)該將 views 的值 +1,這個(gè)過(guò)程最好由 Post 模型自己來(lái)完成,因此再給模型添加一個(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ù)中的值還沒(méi)變),然后調(diào)用 save 方法將更改后的值保存到數(shù)據(jù)庫(kù)。注意這里使用了 update_fields 參數(shù)來(lái)告訴 Django 只更新數(shù)據(jù)庫(kù)中 views 字段的值,以提高效率。
你也許擔(dān)心如果兩個(gè)人同時(shí)訪問(wèn)一篇文章,更改數(shù)據(jù)庫(kù)中的閱讀量字段的值時(shí)會(huì)不會(huì)沖突?其實(shí)不必?fù)?dān)心,我們本來(lái)就不是精確地統(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)求訪問(wèn)某篇文章時(shí),處理該請(qǐng)求的視圖函數(shù)為 detail 。一旦該視圖函數(shù)被調(diào)用,說(shuō)明文章被訪問(wèn)了一次,因此我們修改 detail 視圖函數(shù),讓被訪問(wèn)的文章在視圖函數(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)用戶每訪問(wèn)一次文章詳情,views 記錄的數(shù)值就會(huì) +1,從而達(dá)到粗略統(tǒng)計(jì)閱讀量的目的。
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
- 開(kāi)啟Django博客的RSS功能的實(shí)現(xiàn)方法
- Django 博客實(shí)現(xiàn)簡(jiǎn)單的全文搜索的示例代碼
- Python使用Django實(shí)現(xiàn)博客系統(tǒng)完整版
- 使用python和Django完成博客數(shù)據(jù)庫(kù)的遷移方法
- 利用Celery實(shí)現(xiàn)Django博客PV統(tǒng)計(jì)功能詳解
- Python采用Django開(kāi)發(fā)自己的博客系統(tǒng)
- Python Django搭建網(wǎng)站流程圖解
- Django如何實(shí)現(xiàn)網(wǎng)站注冊(cè)用戶郵箱驗(yàn)證功能
- python3.6+django2.0+mysql搭建網(wǎng)站過(guò)程詳解
- 用Django寫天氣預(yù)報(bào)查詢網(wǎng)站
- Python+Django搭建自己的blog網(wǎng)站
- 利用django創(chuàng)建一個(gè)簡(jiǎn)易的博客網(wǎng)站的示例
相關(guān)文章
Python pygorithm模塊用法示例【常見(jiàn)算法測(cè)試】
這篇文章主要介紹了Python pygorithm模塊用法,結(jié)合實(shí)例形式分析了pygorithm模塊的功能、安裝及針對(duì)常見(jiàn)算法的相關(guān)使用操作技巧,需要的朋友可以參考下2018-08-08詳解pandas庫(kù)pd.read_excel操作讀取excel文件參數(shù)整理與實(shí)例
這篇文章主要介紹了pandas庫(kù)pd.read_excel操作讀取excel文件參數(shù)整理與實(shí)例,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2019-02-02Python3正則表達(dá)式之:(?(id/name)yes-pattern|no-pattern)條件性匹配
(?(id/name)yes-pattern|no-pattern)的作用是對(duì)于給出的id或者name,先嘗試去匹配 yes-pattern部分的內(nèi)容,如果id或name條件不滿足,則去匹配no-pattern部分的內(nèi)容2021-10-10python包pdfkit(wkhtmltopdf)?將HTML轉(zhuǎn)換為PDF的操作方法
pdfkit,把HTML+CSS格式的文件轉(zhuǎn)換成PDF格式文檔的一種工具。它就是html轉(zhuǎn)成pdf工具包wkhtmltopdf的Python封裝。所以,必須手動(dòng)安裝wkhtmltopdf,這篇文章主要介紹了python包pdfkit(wkhtmltopdf)將HTML轉(zhuǎn)換為PDF,需要的朋友可以參考下2022-04-04python實(shí)現(xiàn)文件路徑和url相互轉(zhuǎn)換的方法
這篇文章主要介紹了python實(shí)現(xiàn)文件路徑和url相互轉(zhuǎn)換的方法,以URL轉(zhuǎn)換成文件路徑為例分析了Python實(shí)現(xiàn)地址轉(zhuǎn)換的技巧,需要的朋友可以參考下2015-07-07Pycharm開(kāi)發(fā)Django項(xiàng)目創(chuàng)建ORM模型的問(wèn)題
ORM,全稱Object Relational Mapping,通過(guò)ORM我們可以通過(guò)類的方式去操作數(shù)據(jù)庫(kù),而不用再寫原生的SQL語(yǔ)句,下面通過(guò)本文給大家介紹Pycharm開(kāi)發(fā)Django項(xiàng)目ORM模型介紹,感興趣的朋友一起看看吧2021-10-10pycharm引入其他目錄的包報(bào)錯(cuò),import報(bào)錯(cuò)的解決
這篇文章主要介紹了pycharm引入其他目錄的包報(bào)錯(cuò),import報(bào)錯(cuò)的解決,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-08-08Python 判斷時(shí)間是否在時(shí)間區(qū)間內(nèi)的實(shí)例
這篇文章主要介紹了Python 判斷時(shí)間是否在時(shí)間區(qū)間內(nèi)的實(shí)例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2020-05-05Python查看多臺(tái)服務(wù)器進(jìn)程的腳本分享
這篇文章主要介紹了Python查看多臺(tái)服務(wù)器進(jìn)程的腳本分享,需要的朋友可以參考下2014-06-06