Skip to content

Commit e876bf1

Browse files
committed
增加ua解析记录
1 parent 0d259dc commit e876bf1

File tree

5 files changed

+67
-26
lines changed

5 files changed

+67
-26
lines changed

blog/documents.py

Lines changed: 40 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -51,13 +51,35 @@ class GeoIp(InnerDoc):
5151
location = GeoPoint()
5252

5353

54+
class UserAgentBrowser(InnerDoc):
55+
Family = Keyword()
56+
Version = Keyword()
57+
58+
59+
class UserAgentOS(UserAgentBrowser):
60+
pass
61+
62+
63+
class UserAgentDevice(InnerDoc):
64+
Family = Keyword()
65+
Brand = Keyword()
66+
Model = Keyword()
67+
68+
69+
class UserAgent(InnerDoc):
70+
browser = Object(UserAgentBrowser, required=False)
71+
os = Object(UserAgentOS, required=False)
72+
device = Object(UserAgentDevice, required=False)
73+
string = Text()
74+
75+
5476
class ElapsedTimeDocument(Document):
5577
url = Keyword()
5678
time_taken = Long()
5779
log_datetime = Date()
58-
useragent = Text(analyzer='ik_max_word', search_analyzer='ik_smart')
5980
ip = Keyword()
6081
geoip = Object(GeoIp, required=False)
82+
useragent = Object(UserAgent, required=False)
6183

6284
class Index:
6385
name = 'performance'
@@ -80,11 +102,25 @@ def delete_index():
80102
@staticmethod
81103
def create(url, time_taken, log_datetime, useragent, ip):
82104
from elasticsearch import Elasticsearch
83-
es = Elasticsearch(settings.ELASTICSEARCH_DSL['default']['hosts'])
105+
client = Elasticsearch(settings.ELASTICSEARCH_DSL['default']['hosts'])
84106

85-
res = es.indices.exists(index="performance")
107+
res = client.indices.exists(index="performance")
86108
if not res:
87109
ElapsedTimeDocument.init()
110+
ua = UserAgent()
111+
ua.browser = UserAgentBrowser()
112+
ua.browser.Family = useragent.browser.family
113+
ua.browser.Version = useragent.browser.version_string
114+
115+
ua.browser = UserAgentOS()
116+
ua.browser.Family = useragent.os.family
117+
ua.browser.Version = useragent.os.version_string
118+
119+
ua.device = UserAgentDevice()
120+
ua.device.Family = useragent.device.family
121+
ua.device.Brand = useragent.device.brand
122+
ua.device.Model = useragent.device.model
123+
ua.string = useragent.ua_string
88124

89125
doc = ElapsedTimeDocument(
90126
meta={
@@ -96,7 +132,7 @@ def create(url, time_taken, log_datetime, useragent, ip):
96132
url=url,
97133
time_taken=time_taken,
98134
log_datetime=log_datetime,
99-
useragent=useragent, ip=ip)
135+
useragent=ua, ip=ip)
100136
doc.save(pipeline="geoip")
101137

102138

blog/middleware.py

Lines changed: 20 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@
1616
import time
1717
import logging
1818
from ipware import get_client_ip
19+
from user_agents import parse
1920
from blog.documents import ELASTICSEARCH_ENABLED, ElaspedTimeDocumentManager
2021

2122
logger = logging.getLogger(__name__)
@@ -32,22 +33,23 @@ def __call__(self, request):
3233
response = self.get_response(request)
3334
http_user_agent = request.META.get('HTTP_USER_AGENT', '')
3435
ip, _ = get_client_ip(request)
35-
if 'spider'.upper() not in http_user_agent.upper():
36-
try:
37-
cast_time = time.time() - start_time
38-
if ELASTICSEARCH_ENABLED:
39-
time_taken = round((cast_time) * 1000, 2)
40-
url = request.path
41-
from django.utils import timezone
42-
43-
ElaspedTimeDocumentManager.create(
44-
url=url,
45-
time_taken=time_taken,
46-
log_datetime=timezone.now(),
47-
useragent=http_user_agent,
48-
ip=ip)
49-
response.content = response.content.replace(
50-
b'<!!LOAD_TIMES!!>', str.encode(str(cast_time)[:5]))
51-
except Exception as e:
52-
logger.error("Error OnlineMiddleware: %s" % e)
36+
user_agent = parse(http_user_agent)
37+
38+
try:
39+
cast_time = time.time() - start_time
40+
if ELASTICSEARCH_ENABLED:
41+
time_taken = round((cast_time) * 1000, 2)
42+
url = request.path
43+
from django.utils import timezone
44+
ElaspedTimeDocumentManager.create(
45+
url=url,
46+
time_taken=time_taken,
47+
log_datetime=timezone.now(),
48+
useragent=user_agent,
49+
ip=ip)
50+
response.content = response.content.replace(
51+
b'<!!LOAD_TIMES!!>', str.encode(str(cast_time)[:5]))
52+
except Exception as e:
53+
logger.error("Error OnlineMiddleware: %s" % e)
54+
5355
return response

blog/views.py

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -189,7 +189,8 @@ class AuthorDetailView(ArticleListView):
189189
page_type = '作者文章归档'
190190

191191
def get_queryset_cache_key(self):
192-
author_name = self.kwargs['author_name']
192+
from uuslug import slugify
193+
author_name = slugify(self.kwargs['author_name'])
193194
cache_key = 'author_{author_name}_{page}'.format(
194195
author_name=author_name, page=self.page_number)
195196
return cache_key

docs/docker.md

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,8 @@
77
## docker镜像方式
88
本项目已经支持了docker部署,如果你已经有了`mysql`,那么直接使用基础镜像即可,启动命令如下所示:
99
```shell
10-
docker run -d -p 8000:8000 -e DJANGO_MYSQL_HOST=mysqlhost -e DJANGO_MYSQL_PASSWORD=mysqlrootpassword -e DJANGO_MYSQL_USER=root -e DJANGO_MYSQL_DATABASE=djangoblog --name djangoblog liangliangyy/djangoblog
10+
docker pull liangliangyy/djangoblog:latest
11+
docker run -d -p 8000:8000 -e DJANGO_MYSQL_HOST=mysqlhost -e DJANGO_MYSQL_PASSWORD=mysqlrootpassword -e DJANGO_MYSQL_USER=root -e DJANGO_MYSQL_DATABASE=djangoblog --name djangoblog liangliangyy/djangoblog:latest
1112
```
1213
启动完成后,访问 http://127.0.0.1:8000
1314
## 使用docker-compose

requirements.txt

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -20,8 +20,9 @@ python-slugify==5.0.2
2020
pytz==2021.1
2121
raven==6.10.0
2222
rcssmin==1.0.6
23-
requests==2.25.1
23+
requests==2.26.0
2424
rjsmin==1.1.0
2525
urllib3==1.26.6
2626
WeRoBot==1.13.1
27-
Whoosh==2.7.4
27+
Whoosh==2.7.4
28+
user-agents==2.2.0

0 commit comments

Comments
 (0)