Как определить разные устройства и браузеры в Django 3 используя User-Agent


25 июня 2021


Определение мобильных агентов в Django 3

Пользователи, заходя на сайт, отсылают информацию о своем устройстве и браузере. Эта информация может пригодиться если вы ведете статистику или вам нужно возвращать разные данные для каждого из устройств. Подобная информация называется "User-Agent" и в Django уже есть методы по работе с ними. В этой статье будут рассмотрены примеры по работе с агентами в Django.

 

Как работают агенты

Браузер пользователя отсылает HTTP/S пакет с информацией, которую он считает нужным передать. Набор информации может быть разным, а в некоторых случаях и ложным. В основном это информация о версиях браузера, операционной системе и производителе устройства. Кроме этого в агенте можно передавать свою информацию, которая будет учитываться только вашим приложением.

Учитывая, что существует множество разных версий браузеров и устройств, вариантов агентов существует множество. Самый популярный тип агента на май 2021 (около 10% пользователей):

Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.77 Safari/537.36

В Django эти агенты видны через 'request'. Кроме этого есть пакеты, которые немного автоматизируют процесс.

 

Получаем User-Agent в Django

Получая каждый запрос от пользователя мы можем увидеть параметры агента:

def main(request):
    agent = request.META['HTTP_USER_AGENT']
    print(agent)
    return render(request, 'base.html')

Получение User-Agent используя штатные возможности Django

У нас возвращается строка и это значит, что нам нужно либо парсить данные, либо искать не точное соответствие:

def main(request):
    agent = request.META['HTTP_USER_AGENT']
    if 'Android' in agent:
        print(agent)
    return render(request, 'base.html')

Определяем агента мобильного устройства используя штатные возможности Django

Вы так же можете работать с этими данными через шаблон:

{{ request.headers.user_agent }}

Вывод типа устройства используя агенты Django

 

Пакет user-agents

Мы можем немного автоматизировать работу с агентами с пакетом 'user-agents', который содержит шаблоны известных устройств и небольшую логику по их определению. Установить его можно следующим образом:

pip install pyyaml ua-parser user-agents

Он так же использует 2 дополнительных пакета, которые выполняют следующие задачи:

  • pyyaml - пакет для работы с YAML. В примерах, которые использовались ниже пакет не понадобился и в коде его упоминание не нашел, но в документации указан.
  • ua-parser - парсер агентов.

Он не относится напрямую к Django, но мы можем использовать его передавая на парсинг данные из 'HTTP_USER_AGENT'. Немного примеров того, что мы можем определить:

from django.shortcuts import render
from user_agents import parse

def main(request):
    agent = request.META['HTTP_USER_AGENT']
    agent = parse(agent)
    # Определяем мобильное устройство
    print(agent.device)
    # Определяем производителя
    print(agent.device.brand)
    # Операционная система
    print(agent.os)
    # Семейство операционной системы
    print(agent.os.family)
    # Тип браузера
    print(agent.browser)
    # Версия
    print(agent.browser.version)
    return render(request, 'base.html')

Определение мобильного устройства и ОС через сторонний пакет в Django

Кроме этого, мы можем сразу определить тип устройства, является ли он мобильным телефоном, ПК и т.д.:

from user_agents import parse

ua_string = 'Mozilla/5.0 (Linux; U; Android 4.0.4; en-gb; GT-I9300 Build/IMM76D) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Mobile Safari/534.30'
user_agent = parse(ua_string)
# Мобильный клиент
user_agent.is_mobile
# Планшет
user_agent.is_tablet
# Поддерживает касания
user_agent.is_touch_capable
# ПК
user_agent.is_pc
# Поисковый бот
user_agent.is_bot

 

 

Пакет django-user-agents

Есть более автоматизированное решение для работы с агентами в виде пакета 'django-user-agents'. В PyPi и на странице проекта на GitHub нет указана поддержка для Django 3, но каких-то проблем в работе на этой версии я не встретил.

Установка состоит из 3 дополнительных пакетов, которые описывались раньше:

pip install pyyaml ua-parser user-agents
pip install django-user-agents

Этот пакет должен быть включен в 'INSTALLED_APPS' и 'MIDDLEWARE':

INSTALLED_APPS = (
    ...
    'django_user_agents',
)

...

MIDDLEWARE = (
    # остальные
    'django_user_agents.middleware.UserAgentMiddleware',
)

Дополнительная возможность этого пакета - использовать кэширование агентов для ускорения парсинга:

# ваши настройки кэширования и сервер
CACHES = {
    'my_settings': {
        'BACKEND': 'django.core.cache.backends.memcached.PyMemcacheCache',
        'LOCATION': '127.0.0.1:11211',
    }
}

# указываем какую настройку использовать
USER_AGENTS_CACHE = 'my_settings'

Теперь мы можем обращаться к 'User-Agents' используя методы аналогичные предыдущей главе:

from django.shortcuts import render

def main(request):
    # Пользователь использует мобильное устройство?
    print(request.user_agent.is_mobile)
    # Определяем производителя устройства
    print(request.user_agent.device.family)
    # ОС пользователя
    print(request.user_agent.os)
    # Версия операционной системы
    print(request.user_agent.os.version)
    return render(request, 'base.html')

Определение мобильного устройства и версии браузера через сторонний пакет в Django

Мы так же можем использовать эти методы в шаблоне:

{{ request.user_agent.browser.family }}

{% load user_agents %}

{% if request|is_mobile %}
    Используется мобильное устройство
{% endif %}

Вывод типа устройства пользователя используя агенты в Django 

...

Теги: #python #django


Каналы
Telegram FixMyPc Telegram Лента FixMyPC RSS Rss
Популярные тэги
О блоге
Этот блог представляет собой конспекты выученного материала, приобретённого опыта и лучшие практики в системном администрировании и программировании.