頁面瀏覽統計之(二) tracking
轉:http://www.codingsoho.com/zh/blog/component-tracking/
django-tracking是一個簡單的訪客記錄的應用
前言
本文環境:
Python 2.7.10
Django 1.11
安裝
github主頁 https://github.com/bashu/django-tracking
django-tracking 0.4.1 版本太老
問題
init
裏不能import listeners
,否則User訪問時報錯app未導入
查看github上的源代碼,並沒有這一句,所以去掉應該不會對清理產生影響。這個項目有點亂,github和pypi上有的亂碼新舊不一致
File "E:\Computer\virtualenv\iblog\csblog\tracking\__init__.py", line 1, in <module> import listeners File "E:\Computer\virtualenv\iblog\csblog\tracking\listeners.py", line 9, in <module> from tracking.models import UntrackedUserAgent, BannedIP File "E:\Computer\virtualenv\iblog\csblog\tracking\models.py", line 11, in <module> from django.contrib.auth.models import User File "E:\Computer\virtualenv\iblog\env\lib\site-packages\django\contrib\auth\models.py", line 4, in <module> from django.contrib.auth.base_user import AbstractBaseUser, BaseUserManager File "E:\Computer\virtualenv\iblog\env\lib\site-packages\django\contrib\auth\base_user.py", line 52, in <module> class AbstractBaseUser(models.Model): File "E:\Computer\virtualenv\iblog\env\lib\site-packages\django\db\models\base.py", line 110, in __new__ app_config = apps.get_containing_app_config(module) File "E:\Computer\virtualenv\iblog\env\lib\site-packages\django\apps\registry.py", line 247, in get_containing_app_config self.check_apps_ready() File "E:\Computer\virtualenv\iblog\env\lib\site-packages\django\apps\registry.py", line 125, in check_apps_ready raise AppRegistryNotReady("Apps aren‘t loaded yet.") ango.core.exceptions.AppRegistryNotReady: Apps aren‘t loaded yet.
GEOIP支持
from django.contrib.gis. utilsimport HAS_GEOIP
修改為
from django.contrib.gis.geoip import HAS_GEOIP
django新版本位置變了,而且目前是不支持geoip的
MiddlewareMixin
代碼直接使用會報錯,需要將中間件類的基類改為MiddlewareMixin
Traceback (most recent call last): File "..\env\Lib\site-packages\django\utils\autoreload.py", line 226, in wrapper fn(*args, **kwargs) File "..\env\Lib\site-packages\django\core\management\commands\runserver.py", line 142, in inner_run handler = self.get_handler(*args, **options) File "..\env\Lib\site-packages\django\contrib\staticfiles\management\commands\runserver.py", line 27, in get_handler handler = super(Command, self).get_handler(*args, **options) File "..\env\Lib\site-packages\django\core\management\commands\runserver.py", line 64, in get_handler return get_internal_wsgi_application() File "..\env\Lib\site-packages\django\core\servers\basehttp.py", line 46, in get_internal_wsgi_application return get_wsgi_application() File "..\env\Lib\site-packages\django\core\wsgi.py", line 14, in get_wsgi_application return WSGIHandler() File "..\env\Lib\site-packages\django\core\handlers\wsgi.py", line 153, in __init__ self.load_middleware() File "..\env\Lib\site-packages\django\core\handlers\base.py", line 82, in load_middleware mw_instance = middleware(handler) TypeError: object() takes no parameters
需要在middleware.py裏修改
try:
from django.utils.deprecation import MiddlewareMixin
except ImportError:
MiddlewareMixin = object
class VisitorTrackingMiddleware(MiddlewareMixin):
配置
在settings文件裏添加APP
INSTALLED_APPS = ( ‘django.contrib.admin‘, ‘django.contrib.auth‘, ‘django.contrib.contenttypes‘, ‘django.contrib.sessions‘, ‘django.contrib.sites‘, ... ‘tracking‘, ... )
運行manage.py migrate
同步數據庫
添加middleware,他們分別提供下面功能
tracking.middleware.VisitorTrackingMiddleware
訪客跟蹤,必須在AuthenticationMiddleware後面,這樣才能訪問request.usertracking.middleware.VisitorCleanUpMiddleware
訪客自動清理,它將會自動從數據庫中清除掉過去的訪問者。新版本代碼實現裏去掉了功能,實際是一個空類,需要研究一下。該應用提供命令來清理歷史訪客記錄。tracking.middleware.BannedIPMiddleware
IP黑名單,建議放在最前面,這樣那些被禁止的用戶也不會在其他的middleware裏運行
MIDDLEWARE = [
‘tracking.middleware.BannedIPMiddleware‘,
#
‘django.middleware.security.SecurityMiddleware‘,
‘django.contrib.sessions.middleware.SessionMiddleware‘,
‘django.middleware.common.CommonMiddleware‘,
‘django.middleware.csrf.CsrfViewMiddleware‘,
‘django.contrib.auth.middleware.AuthenticationMiddleware‘,
‘django.contrib.messages.middleware.MessageMiddleware‘,
‘django.middleware.clickjacking.XFrameOptionsMiddleware‘,
#
‘tracking.middleware.VisitorTrackingMiddleware‘,
‘tracking.middleware.VisitorCleanUpMiddleware‘,
]
註意:如果在cms項目中使用的話,記得把它放在cms的middleware前面,否則報錯No module named LanguageCookieMiddlewaretracking.middleware
這個跟cms項目安裝的要求是一致的,避免URL路由匹配問題。
Traceback (most recent call last):
File "env\Lib\site-packages\django\utils\autoreload.py", line 226, in wrapper
fn(*args, **kwargs)
File "env\Lib\site-packages\django\core\management\commands\runserver.py", line 142, in inner_run
handler = self.get_handler(*args, **options)
File "env\Lib\site-packages\django\contrib\staticfiles\management\commands\runserver.py", line 27, in get_handler
handler = super(Command, self).get_handler(*args, **options)
File "env\Lib\site-packages\django\core\management\commands\runserver.py", line 64, in get_handler
return get_internal_wsgi_application()
File "env\Lib\site-packages\django\core\servers\basehttp.py", line 46, in get_internal_wsgi_application
return get_wsgi_application()
File "env\Lib\site-packages\django\core\wsgi.py", line 14, in get_wsgi_application
return WSGIHandler()
File "env\Lib\site-packages\django\core\handlers\wsgi.py", line 153, in __init__
self.load_middleware()
File "env\Lib\site-packages\django\core\handlers\base.py", line 80, in load_middleware
middleware = import_string(middleware_path)
File "env\Lib\site-packages\django\utils\module_loading.py", line 20, in import_string
module = import_module(module_path)
File "D:\Python27\lib\importlib\__init__.py", line 37, in import_module
__import__(name)
ImportError: No module named LanguageCookieMiddlewaretracking.middleware
正確的順序如下
MIDDLEWARE = (
‘tracking.middleware.BannedIPMiddleware‘,
‘tracking2.middleware.VisitorTrackingMiddleware‘,
#
‘cms.middleware.utils.ApphookReloadMiddleware‘,
‘django.contrib.sessions.middleware.SessionMiddleware‘,
‘django.middleware.csrf.CsrfViewMiddleware‘,
‘django.contrib.auth.middleware.AuthenticationMiddleware‘,
‘django.contrib.messages.middleware.MessageMiddleware‘,
‘django.middleware.locale.LocaleMiddleware‘,
‘django.middleware.common.CommonMiddleware‘,
‘django.middleware.clickjacking.XFrameOptionsMiddleware‘,
‘django.contrib.sites.middleware.CurrentSiteMiddleware‘,
#
‘tracking.middleware.VisitorTrackingMiddleware‘,
‘tracking.middleware.VisitorCleanUpMiddleware‘,
#
‘cms.middleware.user.CurrentUserMiddleware‘,
‘cms.middleware.page.CurrentPageMiddleware‘,
‘cms.middleware.toolbar.ToolbarMiddleware‘,
‘cms.middleware.language.LanguageCookieMiddleware‘
)
確保‘django.template.context_processors.request‘
已經在模板處理器中定義,老的名字是django.core.context_processors.request
。
這樣處理器能夠保證request對象可以訪問模板,該應用使用request對象來判斷當前用戶在查看哪個頁面。
TEMPLATES = [
{
‘BACKEND‘: ‘django.template.backends.django.DjangoTemplates‘,
‘DIRS‘: [os.path.join(BASE_DIR,‘templates‘)],
‘APP_DIRS‘: True,
‘OPTIONS‘: {
‘context_processors‘: [
‘django.template.context_processors.debug‘,
‘django.template.context_processors.request‘,
‘django.contrib.auth.context_processors.auth‘,
‘django.contrib.messages.context_processors.messages‘,
],
},
},
]
另外,如果你想看看你的訪問者都來自哪兒,就需要用到map特性。它使用的是google技術,咱又用不了,就不研究了,有興趣直接去github看。
使用
要顯示當前的模板訪問的活躍用戶,首先在模板頭添加{% load tracking_tags %}
,然後添加下面代碼
To display the number of active users there are in one of your templates, make sure you have {% load tracking_tags %} somewhere in your template and do something like this:
{% visitors_on_site as visitors %}
<p>
{{ visitors }} active user{{ visitors|pluralize }}
</p>
如果想看看多少人正在看同一頁
If you also want to show how many people are looking at the same page:
{% visitors_on_page as same_page %}
<p>
{{ same_page }} of {{ visitors }} active user{{ visitors|pluralize }}
{{ same_page|pluralize:"is,are" }} reading this page
</p>
If you don‘t want particular areas of your site to be tracked, you may define a list of prefixes in your settings.py using theN O_TRACKING_PREFIXES. For example, if you didn‘t want visits to the/family/ section of your website,set NO_TRACKING_PREFIXES to[‘/family/‘].
If you don‘t want to count certain user-agents, such as Yahoo!‘s Slurp and Google‘s Google bot, you may add keywords to your visitor tracking in your Django administration interface. Look for "Untracked User-Agents" and add a keyword that distinguishes a particular user-agent. Any visitors with the keyword in their user-agent string will not be tracked.
默認,活躍用戶統計十分鐘內的訪問者,你也可以通過修改settings裏的TRACKING_TIMEOUT改到你想改的任意值
By default, active users include any visitors within the last 10 minutes. If you would like to override that setting, just set TRACKING_TIMEOUT to however many minutes you want in your settings.py.
每24小時,系統自動清理訪問內容,你可以通過覆蓋TRACKING_CLEANUP_TIMEOUT這個值來修改
For automatic visitor clean-up, any records older than 24 hours are removed by default. If you would like to override that setting, set TRACKING_CLEANUP_TIMEOUT to however many hours you want in your settings.py.
頁面瀏覽統計之(二) tracking