Пользователи, заходя на сайт, отсылают информацию о своем устройстве и браузере. Эта информация может пригодиться если вы ведете статистику или вам нужно возвращать разные данные для каждого из устройств. Подобная информация называется "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')
У нас возвращается строка и это значит, что нам нужно либо парсить данные, либо искать не точное соответствие:
def main(request):
agent = request.META['HTTP_USER_AGENT']
if 'Android' in agent:
print(agent)
return render(request, 'base.html')
Вы так же можете работать с этими данными через шаблон:
{{ request.headers.user_agent }}
Пакет 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')
Кроме этого, мы можем сразу определить тип устройства, является ли он мобильным телефоном, ПК и т.д.:
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')
Мы так же можем использовать эти методы в шаблоне:
{{ request.user_agent.browser.family }}
{% load user_agents %}
{% if request|is_mobile %}
Используется мобильное устройство
{% endif %}
...