41 lines
1.4 KiB
Python
41 lines
1.4 KiB
Python
# -*- coding: utf-8 -*-
|
|
|
|
import re
|
|
|
|
from django.utils.deprecation import MiddlewareMixin
|
|
|
|
|
|
class ConstExtendIntField(int):
|
|
def __new__(cls, flag, version=''):
|
|
obj = int.__new__(cls, flag)
|
|
obj.version = version
|
|
return obj
|
|
|
|
|
|
class UserAgentDetectionMiddleware(MiddlewareMixin):
|
|
|
|
def process_request(self, request):
|
|
ua = request.META.get('HTTP_USER_AGENT', '').lower()
|
|
|
|
# ####### Device、OS #######
|
|
# Windows
|
|
request.Windows = 'windows nt' in ua
|
|
# Linux
|
|
request.Linux = 'linux x86_64' in ua
|
|
# iMac、iPhone、iPad、iPod
|
|
request.iMac, request.iPhone, request.iPad, request.iPod = 'macintosh' in ua, 'iphone' in ua, 'ipad' in ua, 'ipod' in ua
|
|
# PC
|
|
request.PC = request.Windows or request.Linux or request.iMac
|
|
# iOS
|
|
request.iOS = request.iPhone or request.iPad or request.iMac or request.iPod
|
|
# Android and Version
|
|
adr = re.findall(r'android ([\d.]+)', ua)
|
|
request.Android = ConstExtendIntField(True, adr[0]) if adr else ConstExtendIntField('android' in ua, '')
|
|
|
|
# ####### APP #######
|
|
# Weixin/Wechat and Version
|
|
wx = re.findall(r'micromessenger[\s/]([\d.]+)', ua)
|
|
request.weixin = request.wechat = ConstExtendIntField(True, wx[0]) if wx else ConstExtendIntField(False, '')
|
|
|
|
return None
|