網站用戶訪問量統計—Django

最近準備棄用Django自帶的admin,將個人博客網站接入hadmin後臺模板,同時想要實現用戶訪問量統計功能。在網上查了一下具體實現方法。衆說紛紜,有接入第三方的、有js實現的、有後端代碼實現的,第三方的話很簡單,在前端頁面上加入幾行代碼就可以了,但是查詢訪問量的時候貌似需要登錄第三方網站才能查詢,而我想要實現在網站上展示這些數據,其次安全性也是一個大問題,本着能造車輪就不閒着的原則,我自己動手寫了一個簡單的訪問量統計功能,包括當日用戶量、總用戶量。同時添加了ip過濾功能——即同一ip同一天內訪問多次時在後端只記錄一次。

實現思路:

在數據庫中建立兩張數據表,分別存放總用戶訪問量和當日訪問用戶IP地址,找到一個用戶訪問網站大概率會經過的頁面,在其後端代碼中加上相應的功能代碼。用戶每訪問一次該頁面,後臺獲取用戶IP地址,再拿該地址到數據庫中比對查看是否已有數據,有的話不執行操作,否則將該IP地址存到數據庫中(實現同一IP多次訪問記錄一次)。

實現代碼:

model文件中創建兩個表

class Website_views(models.Model):
    """
    網站訪問量統計表:字段ID、總訪問量
    """
    nid = models.AutoField(primary_key=True)
    views = models.IntegerField()


class view_ip(models.Model):
    """
    最近訪問用戶IP:字段ID、用戶IP
    """
    nid = models.AutoField(primary_key=True)
    user_ip = models.CharField(max_length=15, null=False)
    create_time = models.DateTimeField(auto_now_add=True)

將訪問量統計功能封裝成對應的函數

def get_user_ip(request):
    if 'HTTP_X_FORWARDED_FOR' in request.META:        # 獲取用戶真實IP地址
        user_ip = request.META['HTTP_X_FORWARDED_FOR']
    else:
        user_ip = request.META['REMOTE_ADDR']
    obj = models.view_ip.objects.first()
    if not obj == None:                                # 判斷數據表是否爲空
        ct = obj.create_time
        if not ct.month == dt.datetime.now().month or not ct.day == dt.datetime.now().day:      # 判斷表中數據是否爲當日訪問
            objs = models.view_ip.objects.all()         # 不是當日訪問則迭代刪除表中數據
            for i in objs:
                i.delete()
        if not models.view_ip.objects.filter(user_ip=user_ip):  # 判斷當日用戶是否已經訪問過本網站
            models.view_ip.objects.create(user_ip=user_ip)  # 將用戶IP存入數據庫
            total_views_add()                         # 網站總訪問量+1
    else:
        # print(user_ip)
        models.view_ip.objects.create(user_ip = user_ip)
        total_views_add()


def total_views_add():
    obj = models.Website_views.objects.first()
    if obj == None:
        models.Website_views.objects.create(views=1)
    else:
        total_views = models.Website_views.objects.first()
        total_views.views = total_views.views + 1
        total_views.save()

當日訪問用戶IP地址表中的數據並不一定是當日的,因爲假如8月5日有10個用戶訪問該網站,此時表中數據是這10個用戶的IP地址,8月6日當有用戶訪問時,數據庫中的數據還是8月5日的這個時候就要對數據進行有效判斷,具體操作是每次有用戶訪問時都取數據表中第一條數據和datatime.now(獲取當前時間),判斷兩者的month和day是否相等,相等則是同日內訪問的有效數據,不相等則說明該用戶是當天第一個訪問本網站的用戶,然後刪除表中所有數據並將該用戶IP地址存入表中。

在對應函數中調用功能函數
在這裏插入圖片描述

效果展示:

在局域網下分別通過主機、ipad、手機多次登錄網站

view_ip表

view_ip表數據展示

Website_views表

Website_views表數據展示
關於前端展示部分還沒有實現,思路很簡單獲取總訪問量直接取表中數據即可,獲取當日訪問量需要先進行數據有效判斷,再統計表中數據的字段總數count。

注:

由於改版後的網站還未上線,只能在局域網下進行簡單的測試,所以代碼中可能還存在一些未知的bug。在網站上線後將進行系統測試並修復bug。
Website_views表中只有一條記錄,這樣看來有些大材小用。其實也可以在static文件中創建一個txt文檔用於保存總訪問量數據,通過python對文本進行讀寫來模擬操作數據庫,不過在代碼上會稍微麻煩一些。
原文地址: https://www.jhxblog.cn/article/?articleid=7

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章