Обнаружение мобильного браузера (не только iPhone) в представлении Python

У меня есть веб-приложение, написанное на Django, с одной конкретной страницей, для которой я хотел бы реализовать мобильную версию шаблона (и немного другую логику). Я хотел бы иметь возможность реализовать его в этом коде sudo:

def(myView)

  do some stuff

  if user-is-on-a-mobile-device:
     do some stuff
     return (my mobile template)

  else:
     do some stuff
     return (my normal template)

У меня не так много времени, и я довольно рано осваиваю кодирование :) - Я нашел то, что выглядит как очень мощное подключаемое приложение под названием bloom для получения возможностей мобильных устройств - http://code.google.com/p/django-bloom/wiki/BloomDevice Однако это кажется, делает запрос через JSON, чтобы получить множество спецификаций устройства, которые мне не нужны, что кажется мне немного неэффективным.

Кто-нибудь может предложить более простой метод? Мое обнаружение не должно быть 100%, только iPhone, iPod, Android и обычные устройства...

Есть ли в строке http_user_agent какой-то мобильный флаг, который я могу проверить?


person Tristan Brotherton    schedule 23.02.2010    source источник


Ответы (3)


Обновлять:

Я только что нашел: http://code.google.com/p/minidetector/

Что, кажется, делает именно то, что я хочу, я собираюсь проверить сейчас. Не стесняйтесь сказать мне, что я ошибаюсь!

person Tristan Brotherton    schedule 23.02.2010
comment
Спасибо, что поделились этой находкой. Для меня то, что делает это промежуточное ПО, выглядит лучшим решением, чем все доморощенные, которые я когда-либо использовал для достижения аналогичных целей. - person ayaz; 11.11.2010
comment
Актуален ли этот проект? Он не претерпел изменений с декабря 2010 года. Вместо этого я использовал github.com/shelfworthy/minidetector. так как он активно развивался. К сожалению, автор только что сказал мне, что он больше не поддерживается, и он хотел удалить этот репозиторий github, поэтому я ищу замену. - person Dan Benamy; 29.11.2011
comment
Если вы проверите сеть на наличие minidector, то обнаружите пару ответвлений, которые не так устарели — github.com /saschwarz/минидетектор/сеть - person Alvin; 13.09.2012

лучшая практика: используйте minidetector, чтобы добавить дополнительную информацию к запросу, а затем используйте встроенный в django контекст запроса, чтобы передать его в ваши шаблоны, как так.

from django.shortcuts import render_to_response
from django.template import RequestContext

def my_view_on_mobile_and_desktop(request)
    .....
    render_to_response('regular_template.html', 
                       {'my vars to template':vars}, 
                       context_instance=RequestContext(request))

то в вашем шаблоне вы можете ввести такие вещи, как:

<html>
  <head>
  {% block head %}
    <title>blah</title>
  {% if request.mobile %}
    <link rel="stylesheet" href="{{ MEDIA_URL }}/styles/base-mobile.css">
  {% else %}
    <link rel="stylesheet" href="{{ MEDIA_URL }}/styles/base-desktop.css">
  {% endif %}
  </head>
  <body>
    <div id="navigation">
      {% include "_navigation.html" %}
    </div>
    {% if not request.mobile %}
    <div id="sidebar">
      <p> sidebar content not fit for mobile </p>
    </div>
    {% endif %>
    <div id="content">
      <article>
        {% if not request.mobile %}
        <aside>
          <p> aside content </p>
        </aside>
        {% endif %}
        <p> article content </p>
      </aricle>
    </div>
  </body>
</html>
person Thomas    schedule 11.11.2010
comment
Многие люди следуют этому соглашению, хотя мне оно не нравится, потому что оно вынуждает разработчиков иметь множество операторов if вместо одного. Вы можете возразить, что отображение разных шаблонов в целом не является СУХИМ, но я думаю, что разумно разделить два этих оператора. стоит того. - person Mikhail; 15.09.2013

перейдите на форк minidetecor под названием django-mobi, он включает документацию о том, как его использовать.

https://pypi.python.org/pypi/django-mobi

person gterzian    schedule 19.03.2013
comment
Это кажется лучшим решением. Описание форка: я реорганизовал код, добавил кеширование и сделал несколько настроек тут и там. - person Druska; 22.04.2013