mercredi 20 décembre 2017

Python MobileDetect Error

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