最近準備棄用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表
Website_views表
關於前端展示部分還沒有實現,思路很簡單獲取總訪問量直接取表中數據即可,獲取當日訪問量需要先進行數據有效判斷,再統計表中數據的字段總數count。
注:
由於改版後的網站還未上線,只能在局域網下進行簡單的測試,所以代碼中可能還存在一些未知的bug。在網站上線後將進行系統測試並修復bug。
Website_views表中只有一條記錄,這樣看來有些大材小用。其實也可以在static文件中創建一個txt文檔用於保存總訪問量數據,通過python對文本進行讀寫來模擬操作數據庫,不過在代碼上會稍微麻煩一些。
原文地址: https://www.jhxblog.cn/article/?articleid=7