2017-02-16 26 views
2

Я пытаюсь найти простой способ определить, поступает ли запрос с мобильного устройства в мои представления Django.Обнаружение мобильных устройств с помощью Django и Python 3

Я пытаюсь реализовать что-то вроде этого:

#views.py 

def myfunction(request): 

    ... 
    if request.mobile: 
     is_mobile = True 
    else: 
     is_mobile = False 

    context = { 
     ... , 
     'is_mobile': is_mobile, 
    } 
    return render(request, 'mytemplate.html', context) 

И в mytemplate.html:

{% if is_mobile %}  
    show something 
{% else %} 
    show something else 
{% endif %} 

Везде я проверил (например here или here) minidetector рекомендуется. Я установил различные версии: pip install minidetector, pip install minidetector2, а также непосредственно пару GitHub хранилищ, но ни один из них не совместимы с Python 3.

Так вот мой вопрос: Есть ли версия/вилка minidetector, совместимый с Python 3? Если нет, то каковы альтернативы?

+0

Вы связаны с irrelevent AttributeError вопрос. Отправьте свой стек tt – e4c5

+0

Ссылка, показывающая, что minidetector несовместим с Python 3. Я удалил и перефразировал эту часть, чтобы избежать путаницы в самом вопросе. – J0ANMM

ответ

5

Django User Agents пакет совместим с Python 3.

Следуйте инструкциям по установке в ссылке, указанной выше, и затем вы можете использовать его следующим образом:

def my_view(request): 

    # Let's assume that the visitor uses an iPhone... 
    request.user_agent.is_mobile # returns True 
    request.user_agent.is_tablet # returns False 
    request.user_agent.is_touch_capable # returns True 
    request.user_agent.is_pC# returns False 
    request.user_agent.is_bot # returns False 

    # Accessing user agent's browser attributes 
    request.user_agent.browser # returns Browser(family=u'Mobile Safari', version=(5, 1), version_string='5.1') 
    request.user_agent.browser.family # returns 'Mobile Safari' 
    request.user_agent.browser.version # returns (5, 1) 
    request.user_agent.browser.version_string # returns '5.1' 

    # Operating System properties 
    request.user_agent.os # returns OperatingSystem(family=u'iOS', version=(5, 1), version_string='5.1') 
    request.user_agent.os.family # returns 'iOS' 
    request.user_agent.os.version # returns (5, 1) 
    request.user_agent.os.version_string # returns '5.1' 

    # Device properties 
    request.user_agent.device # returns Device(family='iPhone') 
    request.user_agent.device.family # returns 'iPhone' 

Использование в шаблоне выглядит следующим образом:

{% if request.user_agent.is_mobile %} 
    Do stuff here... 
{% endif %} 

Однако обратите внимание, что класс промежуточного ПО был изменен в Django 1.10. Поэтому, если вы используете Django 1.10 +, вам придется изменить определение класса промежуточного ПО в этом пакете, как указано в этом GitHub issue tracker page.

4

Я нашел альтернативный способ, начиная с this answer.

При добавлении дополнительной функции в views.py:

import re 

def mobile(request): 
"""Return True if the request comes from a mobile device.""" 

    MOBILE_AGENT_RE=re.compile(r".*(iphone|mobile|androidtouch)",re.IGNORECASE) 

    if MOBILE_AGENT_RE.match(request.META['HTTP_USER_AGENT']): 
     return True 
    else: 
     return False 


def myfunction(request): 

    ... 
    if mobile(request): 
     is_mobile = True 
    else: 
     is_mobile = False 

    context = { 
     ... , 
     'is_mobile': is_mobile, 
    } 
    return render(request, 'mytemplate.html', context)