博客閱讀數(shù)的統(tǒng)計三部曲【一】-3種方式

[TOC]

1.粗略統(tǒng)計

博客閱讀數(shù)的統(tǒng)計根據(jù)業(yè)務(wù)的精細(xì)度可以多種方法實(shí)現(xiàn)懂扼,其中最簡單的方式就是在models.py定義readed_num字段溪椎,然后在打開文章詳情頁時候給閱讀數(shù)字段+1即可(此方法計算不準(zhǔn)確,刷新頁面也會使得閱讀數(shù)增加贫悄,在粗略計算下可以使用)


blog/models.py
blog/views.py

2.使用cookie統(tǒng)計

設(shè)置cookie堵未,并獲取cookie來判斷該篇文章是否閱讀過
根據(jù)設(shè)置訪問文章的cookie的鍵key和值value來標(biāo)記文章是否被閱讀過卷要,如果閱讀過設(shè)置cookie,在打開文章時候先獲取cookie來判斷是否存在扶平,如果不存在帆离,閱讀數(shù)+1蔬蕊;cookie存在則閱讀數(shù)保持不變

存在問題
1.每次閱讀數(shù)改變的時候结澄,admin管理后臺的更新時間會跟著變化
2.當(dāng)管理員在編輯某篇文章哥谷,此時有人點(diǎn)擊該篇文章,閱讀數(shù)增加麻献,但是管理員編輯修改完文章保存后们妥,閱讀數(shù)會是管理員編輯文章時候的閱讀數(shù)量

blog/models.py
blog/views.py
def blog_detail(request,blog_pk):
    """博客詳情頁"""
    blog=get_object_or_404(Blog,pk=blog_pk) # 根據(jù)傳入blog_pk的ID來找到具體對應(yīng)博客文章

    # 獲取cookie:根據(jù)獲取cookie的key值'blog_%s_readed' % blog_pk,判斷是否存在勉吻,不存在則閱讀數(shù)+1
    if not request.COOKIES.get('blog_%s_readed' % blog_pk):
        blog.readed_num += 1    #點(diǎn)擊該篇文章监婶,閱讀數(shù)自增1
        blog.save()

    pre_blog=Blog.objects.filter(id__gt=blog.id).last() # 博客的上一篇文章
    next_blog=Blog.objects.filter(id__lt=blog.id).first()   # 博客的下一篇文章
    response=render(request,'blog/blog_detail.html',{'blog':blog,'pre_blog':pre_blog,'next_blog':next_blog})    #響應(yīng)
    
    # 設(shè)置cookie,打開過這篇文章即寫入cookie,key是'blog_%s_readed' % blog_pk,value是'true'
    response.set_cookie('blog_%s_readed' % blog_pk,'true')
    return response

3.模型分離

Github源碼地址:請點(diǎn)這里

image.png
  • 1.創(chuàng)建模型
    在blog應(yīng)用下面的models.py添加ReadNum類:


    image.png

代碼示例:

class ReadNum(models.Model):
    read_num=models.IntegerField(default=0,verbose_name='閱讀數(shù)')
    blog=models.OneToOneField(Blog,on_delete=models.DO_NOTHING,verbose_name='標(biāo)題')

    class Meta:
        verbose_name='閱讀數(shù)'
        verbose_name_plural=verbose_name

這種方式可以避免方式2中存在的2個問題

  • 2.同步數(shù)據(jù)庫操作,模型創(chuàng)建完成后記得:
    python manage.py makemigratiosn
    python manage.py migrate

  • 3.admin.py添加到后臺管理頁面


    image.png
class ReadNumAdmin(admin.ModelAdmin):
    list_display=('id','read_num','blog')

admin.site.register(ReadNum,ReadNumAdmin)
  • 為了讓閱讀數(shù)在blog管理頁面顯示齿桃,在models.py的Blog模型添加get_read_num()方法
    注意:此處會如果謀篇文章暫時還沒有閱讀數(shù)惑惶,默認(rèn)情況下顯示的不是0,而是-短纵,實(shí)際上是拋出了一個異常带污,該異常不處理,則顯示閱讀數(shù)是0的顯示-香到,處理后正常顯示0
    錯誤顯示為:
    image.png
image.png
image.png

blog應(yīng)用下面的Blog模型里添加

from django.db.models.fields import exceptions
   
 # 添加方法,添加的read_num方法鱼冀,用于在admin管理后臺的blog頁面顯示閱讀數(shù)。即在admin.py的BlogAdmin類的list_display添加read_num
    def get_read_num(self):
        # 返回該篇文章的閱讀數(shù),此處如果該文章還沒有閱讀數(shù)悠就,會有個異常千绪,該異常是的默認(rèn)閱讀數(shù)不是0,而是-
        try:
            return self.readnum.read_num
        except exception.ObjectDoesNotExist:
            return 0
  • 4.views.py邏輯處理

此處需要先判斷是否cookie存在梗脾,不存在則繼續(xù)判斷該篇文章的閱讀數(shù)是否存在荸型,如果存在則閱讀數(shù)+1并保存數(shù)據(jù)庫;如果不存在炸茧,需要先創(chuàng)建該篇文章的閱讀數(shù)(創(chuàng)建是為了在閱讀數(shù)模型保存數(shù)據(jù)帆疟,具體如下admin管理頁面截圖),再閱讀數(shù)+1并保存數(shù)據(jù)庫


image.png
![image.png](http://upload-images.jianshu.io/upload_images/545178-9a550efc95446394.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
def blog_detail(request,blog_pk):
    """博客詳情頁"""
    blog=get_object_or_404(Blog,pk=blog_pk) # 根據(jù)傳入blog_pk的ID來找到具體對應(yīng)博客文章

    # 獲取cookie:根據(jù)獲取cookie的key值'blog_%s_readed' % blog_pk宇立,判斷是否存在踪宠,不存在則閱讀數(shù)+1
    if not request.COOKIES.get('blog_%s_read' % blog_pk):
        if ReadNum.objects.filter(blog=blog).count():
            # 記錄存在,則查詢并閱讀數(shù)+1,保存
            readnum=ReadNum.objects.get(blog=blog)
        else:
            # 對應(yīng)記錄不存在妈嘹,則創(chuàng)建并閱讀數(shù)+1柳琢,保存(這樣就會在閱讀數(shù)管理頁面點(diǎn)擊后保存對應(yīng)文章以及閱讀數(shù))
            readnum=ReadNum(blog=blog)
        readnum.read_num += 1    #點(diǎn)擊該篇文章,閱讀數(shù)自增1
        readnum.save()

    pre_blog=Blog.objects.filter(id__gt=blog.id).last() # 博客的上一篇文章
    next_blog=Blog.objects.filter(id__lt=blog.id).first()   # 博客的下一篇文章
    response=render(request,'blog/blog_detail.html',{'blog':blog,'pre_blog':pre_blog,'next_blog':next_blog})    #響應(yīng)
    
    # 設(shè)置cookie,打開過這篇文章即寫入cookie,key是'blog_%s_readed' % blog_pk,value是'true'
    response.set_cookie('blog_%s_read' % blog_pk,'true')
    return response
  • 5.修改html模版文件閱讀的顯示
    直接使用Blog模型中的get_read_num()方法


    image.png
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末润脸,一起剝皮案震驚了整個濱河市柬脸,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌毙驯,老刑警劉巖倒堕,帶你破解...
    沈念sama閱讀 219,366評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異爆价,居然都是意外死亡垦巴,警方通過查閱死者的電腦和手機(jī)媳搪,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,521評論 3 395
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來骤宣,“玉大人秦爆,你說我怎么就攤上這事°九” “怎么了等限?”我有些...
    開封第一講書人閱讀 165,689評論 0 356
  • 文/不壞的土叔 我叫張陵,是天一觀的道長芬膝。 經(jīng)常有香客問我望门,道長,這世上最難降的妖魔是什么锰霜? 我笑而不...
    開封第一講書人閱讀 58,925評論 1 295
  • 正文 為了忘掉前任怒允,我火速辦了婚禮,結(jié)果婚禮上锈遥,老公的妹妹穿的比我還像新娘纫事。我一直安慰自己,他們只是感情好所灸,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,942評論 6 392
  • 文/花漫 我一把揭開白布丽惶。 她就那樣靜靜地躺著,像睡著了一般爬立。 火紅的嫁衣襯著肌膚如雪钾唬。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,727評論 1 305
  • 那天侠驯,我揣著相機(jī)與錄音抡秆,去河邊找鬼。 笑死吟策,一個胖子當(dāng)著我的面吹牛儒士,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播檩坚,決...
    沈念sama閱讀 40,447評論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼着撩,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了匾委?” 一聲冷哼從身側(cè)響起拖叙,我...
    開封第一講書人閱讀 39,349評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎赂乐,沒想到半個月后薯鳍,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,820評論 1 317
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡挨措,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,990評論 3 337
  • 正文 我和宋清朗相戀三年挖滤,在試婚紗的時候發(fā)現(xiàn)自己被綠了崩溪。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,127評論 1 351
  • 序言:一個原本活蹦亂跳的男人離奇死亡壶辜,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出担租,到底是詐尸還是另有隱情砸民,我是刑警寧澤,帶...
    沈念sama閱讀 35,812評論 5 346
  • 正文 年R本政府宣布奋救,位于F島的核電站岭参,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏尝艘。R本人自食惡果不足惜演侯,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,471評論 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望背亥。 院中可真熱鬧秒际,春花似錦、人聲如沸狡汉。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,017評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽盾戴。三九已至寄锐,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間尖啡,已是汗流浹背橄仆。 一陣腳步聲響...
    開封第一講書人閱讀 33,142評論 1 272
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留衅斩,地道東北人盆顾。 一個月前我還...
    沈念sama閱讀 48,388評論 3 373
  • 正文 我出身青樓,卻偏偏與公主長得像畏梆,于是被迫代替她去往敵國和親椎扬。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,066評論 2 355