I am currently working on a Flask Web Application in Python.
But if I want to detect the users browser (mobile/desktop), I am stuck with this error:
`[2017-12-20 15:09:22,973] ERROR in app: Exception on / [GET]
Traceback (most recent call last):
File "/home/rene/.pyenv/versions/general/lib/python3.6/site-packages/flask/app.py", line 1982, in wsgi_app
response = self.full_dispatch_request()
File "/home/rene/.pyenv/versions/general/lib/python3.6/site-packages/flask/app.py", line 1614, in full_dispatch_request
rv = self.handle_user_exception(e)
File "/home/rene/.pyenv/versions/general/lib/python3.6/site-packages/flask/app.py", line 1517, in handle_user_exception
reraise(exc_type, exc_value, tb)
File "/home/rene/.pyenv/versions/general/lib/python3.6/site-packages/flask/_compat.py", line 33, in reraise raise value File "/home/rene/.pyenv/versions/general/lib/python3.6/site-packages/flask/app.py", line 1612, in full_dispatch_request rv = self.dispatch_request() File "/home/rene/.pyenv/versions/general/lib/python3.6/site-packages/flask/app.py", line 1598, in dispatch_request return self.view_functionsrule.endpoint File "/home/rene/rep0st/web/site.py", line 27, in starting_page return custom_render_template() File "/home/rene/rep0st/web/site.py", line 107, in custom_render_template test = detect.MobileDetect() File "/home/rene/rep0st/web/detect.py", line 86, in init self.useragent = request.META.get('HTTP_USER_AGENT') AttributeError: 'NoneType' object has no attribute 'META'`
This is my detect.py file, but I dont get it why it stucks at the request thing:
"""
Mobile Detect - Python detection mobile phone and tablet devices
Thanks to:
http://ift.tt/2kOhlfV
"""
import os
import re
import json
from hashlib import sha1
OPERATINGSYSTEMS = {}
DEVICE_PHONES = {}
DEVICE_TABLETS = {}
DEVICE_BROWSERS = {}
ALL_RULES = {}
MOBILE_HTTP_HEADERS = {}
UA_HTTP_HEADERS = {}
class MobileDetectRuleFileError(Exception):
pass
class MobileDetectError(Exception):
pass
def load_rules(filename=None):
global OPERATINGSYSTEMS
global DEVICE_PHONES
global DEVICE_TABLETS
global DEVICE_BROWSERS
global ALL_RULES
global MOBILE_HTTP_HEADERS
global UA_HTTP_HEADERS
if filename is None:
filename = os.path.join(
os.path.dirname(os.path.realpath(__file__)), Mobile_Detect.json")
rules = json.load(open(filename))
if not "version" in rules:
raise MobileDetectRuleFileError(
"version not found in rule file: %s" % filename)
if not "headerMatch" in rules:
raise MobileDetectRuleFileError(
"section 'headerMatch' not found in rule file: %s" % filename)
if not "uaHttpHeaders" in rules:
raise MobileDetectRuleFileError(
"section 'uaHttpHeaders' not found in rule file: %s" % filename)
if not "uaMatch" in rules:
raise MobileDetectRuleFileError(
"section 'uaMatch' not found in rule file: %s" % filename)
MOBILE_HTTP_HEADERS = dict(
(http_header, matches) for http_header, matches in
rules["headerMatch"].items())
UA_HTTP_HEADERS = rules['uaHttpHeaders']
OPERATINGSYSTEMS = dict(
(name, re.compile(match, re.IGNORECASE|re.DOTALL))
for name, match in rules['uaMatch']['os'].items())
DEVICE_PHONES = dict(
(name, re.compile(match, re.IGNORECASE|re.DOTALL))
for name, match in rules['uaMatch']['phones'].items())
DEVICE_TABLETS = dict(
(name, re.compile(match, re.IGNORECASE|re.DOTALL))
for name, match in rules['uaMatch']['tablets'].items())
DEVICE_BROWSERS = dict(
(name, re.compile(match, re.IGNORECASE|re.DOTALL))
for name, match in rules['uaMatch']['browsers'].items())
ALL_RULES = {}
ALL_RULES.update(OPERATINGSYSTEMS)
ALL_RULES.update(DEVICE_PHONES)
ALL_RULES.update(DEVICE_TABLETS)
ALL_RULES.update(DEVICE_BROWSERS)
load_rules()
class MobileDetect(object):
def __init__(self, request=None, useragent=None, headers=None):
self.request = request
self.useragent = useragent
self.headers = {}
if self.useragent is None:
self.useragent = request.META.get('HTTP_USER_AGENT')
if self.useragent is None:
self.useragent = request.META.get('HTTP_X_DEVICE_USER_AGENT')
if self.useragent is None:
self.useragent = ""
if self.request is not None:
for http_header, matches in MOBILE_HTTP_HEADERS.items():
if not http_header in request.META:
continue
header_value = request.META[http_header]
if (matches and isinstance(matches, dict) and
'matches' in matches):
if not header_value in matches['matches']:
continue
self.headers[http_header] = header_value
if 'HTTP_X_OPERAMINI_PHONE_UA' in request.META:
self.useragent = "%s %s" % (
self.useragent,request.META['HTTP_X_OPERAMINI_PHONE_UA'])
for http_header in UA_HTTP_HEADERS:
if http_header in request.META:
self.headers[http_header] = None
if headers is not None:
self.headers.update(headers)
def __getitem__(self, key):
try:
if ALL_RULES[key].search(self.useragent):
return True
except KeyError:
pass
return False
def __contains__(self, key):
try:
if ALL_RULES[key].search(self.useragent):
return True
except KeyError:
pass
return False
@property
def device_hash(self):
if not hasattr(self, '_device_hash'):
hsh = sha1(self.useragent)
for k, v in self.headers.items():
hsh.update("%s:%s" % (k, v))
self._device_hash = hsh.hexdigest()
return self._device_hash
def mobile_by_headers(self):
"""
Check the HTTP Headers for signs of mobile devices.
This is the fastest mobile check but probably also the most reliable.
"""
if self.headers:
return True
return False
def mobile_by_useragent(self):
return (self.is_phone() or self.is_tablet() or self.is_mobile_os()
or self.is_mobile_ua())
def is_phone(self):
if self.detect_phone():
return True
return False
def is_tablet(self):
if self.detect_tablet():
return True
return False
def is_mobile_os(self):
if self.detect_mobile_os():
return True
return False
def is_mobile_ua(self):
if self.detect_mobile_ua():
return True
return False
def detect_phone(self):
""" Is Phone Device """
for name, rule in DEVICE_PHONES.items():
if rule.search(self.useragent):
return name
return False
def detect_tablet(self):
""" Is Tabled Device """
for name, rule in DEVICE_TABLETS.items():
if rule.search(self.useragent):
return name
return False
def detect_mobile_os(self):
""" Is Mobile OperatingSystem """
for name, rule in OPERATINGSYSTEMS.items():
if rule.search(self.useragent):
return name
return False
def detect_mobile_ua(self):
""" Is Mobile User-Agent """
for name, rule in DEVICE_BROWSERS.items():
if rule.search(self.useragent):
return name
return False
def is_mobile(self):
if self.mobile_by_headers():
return True
if self.mobile_by_useragent():
return True
return False
def match(self, item):
return item in self
So maybe with one of you guys can help me with my problem there.
If you need any more information about the Application, you should just ask them to me
Aucun commentaire:
Enregistrer un commentaire