diff --git a/blog/documents.py b/blog/documents.py index 8e117b9..ccb3edf 100644 --- a/blog/documents.py +++ b/blog/documents.py @@ -51,13 +51,35 @@ class GeoIp(InnerDoc): location = GeoPoint() +class UserAgentBrowser(InnerDoc): + Family = Keyword() + Version = Keyword() + + +class UserAgentOS(UserAgentBrowser): + pass + + +class UserAgentDevice(InnerDoc): + Family = Keyword() + Brand = Keyword() + Model = Keyword() + + +class UserAgent(InnerDoc): + browser = Object(UserAgentBrowser, required=False) + os = Object(UserAgentOS, required=False) + device = Object(UserAgentDevice, required=False) + string = Text() + + class ElapsedTimeDocument(Document): url = Keyword() time_taken = Long() log_datetime = Date() - useragent = Text(analyzer='ik_max_word', search_analyzer='ik_smart') ip = Keyword() geoip = Object(GeoIp, required=False) + useragent = Object(UserAgent, required=False) class Index: name = 'performance' @@ -80,11 +102,25 @@ class ElaspedTimeDocumentManager(): @staticmethod def create(url, time_taken, log_datetime, useragent, ip): from elasticsearch import Elasticsearch - es = Elasticsearch(settings.ELASTICSEARCH_DSL['default']['hosts']) + client = Elasticsearch(settings.ELASTICSEARCH_DSL['default']['hosts']) - res = es.indices.exists(index="performance") + res = client.indices.exists(index="performance") if not res: ElapsedTimeDocument.init() + ua = UserAgent() + ua.browser = UserAgentBrowser() + ua.browser.Family = useragent.browser.family + ua.browser.Version = useragent.browser.version_string + + ua.browser = UserAgentOS() + ua.browser.Family = useragent.os.family + ua.browser.Version = useragent.os.version_string + + ua.device = UserAgentDevice() + ua.device.Family = useragent.device.family + ua.device.Brand = useragent.device.brand + ua.device.Model = useragent.device.model + ua.string = useragent.ua_string doc = ElapsedTimeDocument( meta={ @@ -96,7 +132,7 @@ class ElaspedTimeDocumentManager(): url=url, time_taken=time_taken, log_datetime=log_datetime, - useragent=useragent, ip=ip) + useragent=ua, ip=ip) doc.save(pipeline="geoip") diff --git a/blog/middleware.py b/blog/middleware.py index 4732baf..0d3fe5b 100644 --- a/blog/middleware.py +++ b/blog/middleware.py @@ -16,6 +16,7 @@ import time import logging from ipware import get_client_ip +from user_agents import parse from blog.documents import ELASTICSEARCH_ENABLED, ElaspedTimeDocumentManager logger = logging.getLogger(__name__) @@ -32,22 +33,23 @@ class OnlineMiddleware(object): response = self.get_response(request) http_user_agent = request.META.get('HTTP_USER_AGENT', '') ip, _ = get_client_ip(request) - if 'spider'.upper() not in http_user_agent.upper(): - try: - cast_time = time.time() - start_time - if ELASTICSEARCH_ENABLED: - time_taken = round((cast_time) * 1000, 2) - url = request.path - from django.utils import timezone - - ElaspedTimeDocumentManager.create( - url=url, - time_taken=time_taken, - log_datetime=timezone.now(), - useragent=http_user_agent, - ip=ip) - response.content = response.content.replace( - b'', str.encode(str(cast_time)[:5])) - except Exception as e: - logger.error("Error OnlineMiddleware: %s" % e) + user_agent = parse(http_user_agent) + + try: + cast_time = time.time() - start_time + if ELASTICSEARCH_ENABLED: + time_taken = round((cast_time) * 1000, 2) + url = request.path + from django.utils import timezone + ElaspedTimeDocumentManager.create( + url=url, + time_taken=time_taken, + log_datetime=timezone.now(), + useragent=user_agent, + ip=ip) + response.content = response.content.replace( + b'', str.encode(str(cast_time)[:5])) + except Exception as e: + logger.error("Error OnlineMiddleware: %s" % e) + return response diff --git a/blog/views.py b/blog/views.py index 2406f19..4b62f78 100644 --- a/blog/views.py +++ b/blog/views.py @@ -189,7 +189,8 @@ class AuthorDetailView(ArticleListView): page_type = '作者文章归档' def get_queryset_cache_key(self): - author_name = self.kwargs['author_name'] + from uuslug import slugify + author_name = slugify(self.kwargs['author_name']) cache_key = 'author_{author_name}_{page}'.format( author_name=author_name, page=self.page_number) return cache_key diff --git a/docs/docker.md b/docs/docker.md index 761e448..123e64e 100644 --- a/docs/docker.md +++ b/docs/docker.md @@ -7,7 +7,8 @@ ## docker镜像方式 本项目已经支持了docker部署,如果你已经有了`mysql`,那么直接使用基础镜像即可,启动命令如下所示: ```shell - 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 +docker pull liangliangyy/djangoblog:latest +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 ``` 启动完成后,访问 http://127.0.0.1:8000 ## 使用docker-compose diff --git a/requirements.txt b/requirements.txt index 75809ab..f393fd4 100644 --- a/requirements.txt +++ b/requirements.txt @@ -20,8 +20,9 @@ python-slugify==5.0.2 pytz==2021.1 raven==6.10.0 rcssmin==1.0.6 -requests==2.25.1 +requests==2.26.0 rjsmin==1.1.0 urllib3==1.26.6 WeRoBot==1.13.1 -Whoosh==2.7.4 \ No newline at end of file +Whoosh==2.7.4 +user-agents==2.2.0