Изменение шаблонов Django на основе User-Agent
Я сделал сайт Django, но я выпил Koolaid, и я хочу сделать IPhone версия. После того, как я много думал, я придумал два варианта:
- сделать целый другой сайт, как i.xxxx.com - ... Привяжите его к той же базе данных, используя структуру сайтов Django.
- найдите некоторое время промежуточного ПО, которое считывает user-agent и динамически изменяет каталоги шаблонов.
Я бы предпочел вариант № 2, однако; У меня есть некоторые оговорки, в основном потому, что документация Django препятствует изменению настроек на лету. Я нашел фрагмент это сделает то, что я хотел бы. Моя главная проблема заключается в том, чтобы она была максимально бесшовной, я бы хотел, чтобы она была автоматической и прозрачной для пользователя.
кто-нибудь еще сталкивался с той же проблемой? Кто-нибудь хотел бы поделиться о том, как они справились с созданием IPhone-версий Django сайты?
обновление
Я пошел с комбинацией промежуточного программного обеспечения и настройки вызова шаблона.
для middleware, я использовал minidetector. Мне нравится, потому что он обнаруживает множество мобильных пользовательских агентов. Все, что мне нужно сделать, это проверить запрос.мобильный в моих взглядах.
для настройки вызова шаблона:
def check_mobile(request, template_name):
if request.mobile:
return 'mobile-%s'%template_name
return template_name
Я использую это для любого представления, которое я знаю, что у меня есть оба версии.
TODO:
- выяснить, как получить доступ к запрос.мобильный в расширенной версии render_to_response, поэтому мне не нужно использовать check_mobile ('template_name.HTML-код')
- использование предыдущего автоматического возврата к обычному шаблону, если мобильная версия не существует.
10 ответов
вместо динамического изменения каталогов шаблонов вы можете изменить запрос и добавить значение, которое позволяет вашему представлению знать, находится ли пользователь на iphone или нет. Затем оберните render_to_response (или то, что вы используете для создания объектов HttpResponse), чтобы захватить iphone-версию шаблона вместо стандартной html-версии, если они используют iphone.
обнаружение агента пользователя в промежуточном по, переключение Привязок url, прибыль!
как? Объекты запроса Django имеют .атрибут urlconf, который может быть установлен промежуточным по.
из документов django:
Django определяет корневой URLconf модуль для использования. Обычно это значение параметра ROOT_URLCONF, но если входящий объект HttpRequest имеет атрибут с именем urlconf (задается middleware обработка запросов), его значение будет использованный вместо Настройка ROOT_URLCONF.
-
In yourproj/middlware.py, напишите класс, который проверяет строку http_user_agent:
import re MOBILE_AGENT_RE=re.compile(r".*(iphone|mobile|androidtouch)",re.IGNORECASE) class MobileMiddleware(object): def process_request(self,request): if MOBILE_AGENT_RE.match(request.META['HTTP_USER_AGENT']): request.urlconf="yourproj.mobile_urls"
-
не забудьте добавить это в MIDDLEWARE_CLASSES в settings.py:
MIDDLEWARE_CLASSES= [... 'yourproj.middleware.MobileMiddleware', ...]
-
создать мобильный urlconf, yourproj/mobile_urls.py:
urlpatterns=patterns('',('r'/?$', 'mobile.index'), ...)
эта статья может быть полезна: создайте мобильное и удобное для рабочего стола приложение в Django за 15 минут
Я разрабатываю djangobile, мобильное расширение django:http://code.google.com/p/djangobile/
вы должны взглянуть на django-mobileadmin исходный код, который решил именно эту проблему.
другим способом было бы создание собственного загрузчика шаблонов, который загружает шаблоны, специфичные для агента пользователя. Это довольно общий метод и может использоваться для динамического определения того, какой шаблон должен быть загружен в зависимости от других факторов, таких как запрошенный язык (хороший компаньон для существующего оборудования Django i18n).
книга Джанго имеет на эту тему.
есть хорошая статья, в которой объясняется, как отображать одни и те же данные по разным шаблонам http://www.postneo.com/2006/07/26/acknowledging-the-mobile-web-with-django
вам все равно нужно автоматически перенаправить пользователя на мобильный сайт, однако, и это можно сделать с помощью нескольких методов (ваш трюк check_mobile тоже будет работать)
Как насчет перенаправления пользователя i.xxx.com после разбора его UA в некоторых промежуточное? Я очень сомневаюсь, что мобильные пользователи заботятся о том, как выглядит url, но они могут получить доступ к вашему сайту с помощью основного url.
наилучший сценарий: используйте 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>
простым решением является создание обертки вокруг django.shortcuts.render
. Я положил свой в utils
библиотека в корне моего приложения. Оболочка работает путем автоматического отображения шаблонов в папке" мобильный "или" рабочий стол".
на utils.shortcuts
:
from django.shortcuts import render from user_agents import parse def my_render(request, *args, **kwargs): """ An extension of django.shortcuts.render. Appends 'mobile/' or 'desktop/' to a given template location to render the appropriate template for mobile or desktop depends on user_agents python library https://github.com/selwin/python-user-agents """ template_location = args[0] args_list = list(args) ua_string = request.META['HTTP_USER_AGENT'] user_agent = parse(ua_string) if user_agent.is_mobile: args_list[0] = 'mobile/' + template_location args = tuple(args_list) return render(request, *args, **kwargs) else: args_list[0] = 'desktop/' + template_location args = tuple(args_list) return render(request, *args, **kwargs)
на view
:
from utils.shortcuts import my_render def home(request): return my_render(request, 'home.html')