跳转到主要内容

检测移动浏览器并向其提供不同的模板版本。

项目描述

Build Status

django-mobile 提供了一种简单的方法来检测移动浏览器,并为您提供工具来渲染不同的模板,以向用户提供移动版网站。

想法是保持视图完全相同,但透明地交换用于渲染响应的模板。这是通过两个步骤完成的

  1. 中间件确定客户端查看您的网站的偏好。例如,如果他想使用移动版或完整桌面版。

  2. 模板加载器随后负责根据中间件中检测到的版本选择正确的模板。

安装

预-要求: django_mobile 依赖于django的会话框架。因此,在尝试使用 django_mobile 之前,请确保会话框架已启用且正常工作。

  1. 使用您喜欢的Python工具安装 django_mobile,例如使用 easy_install django_mobilepip install django_mobile

  2. django_mobile 添加到 settings.py 文件的 INSTALLED_APPS 设置中。

  3. django_mobile.middleware.MobileDetectionMiddleware 添加到您的 MIDDLEWARE_CLASSES 设置。

  4. django_mobile.middleware.SetFlavourMiddleware 添加到您的 MIDDLEWARE_CLASSES 设置中。确保它在 MobileDetectionMiddlewareSessionMiddleware 之后列出。

  5. django_mobile.loader.Loader 作为第一个元素添加到您的 settings.py 文件的 TEMPLATE_LOADERS 列表中。

  6. django_mobile.context_processors.flavour 添加到您的 TEMPLATE_CONTEXT_PROCESSORS 设置。

现在您应该能够以最佳状态使用 django-mobile。请阅读以下内容,了解如何操作以及哪些设置可以调整以修改 django-mobile 的行为。

用法

django-mobile 的概念是基于为您的网站创建不同的 flavours。例如,mobile 版本被描述为一种可能的 flavour,桌面版本为另一种。

这使得能够提供许多可能的设计,而不仅仅是区分完整的桌面体验和一个移动版本。您可以提供多个移动 flavours,例如,一个适用于 iPhone 和 Android 的移动 Safari,以及一个适用于 Opera 的,还有一个额外的用于互联网平板电脑(如 iPad)的。

注意: 默认情况下,django-mobile 只区分 fullmobile flavour

在中间件正确选择 flavour 之后,它被分配给 request.flavour 属性。您可以在视图中使用此属性以提供单独的逻辑。

然后使用此 flavour 透明地选择特定于该 flavour 的自定义模板。选定的模板将在您实际想要渲染的模板名称前加上当前 flavour。这意味着当使用 render_to_response('index.html', ...) 并激活 mobile flavour 时,实际上会返回一个使用 mobile/index.html 模板渲染的响应。然而,如果此带 flavour 的模板不可用,它将优雅地回退到默认的 index.html 模板。

在某些情况下,可能不是每个 flavour 都需要完全独立的模板。您还可以使用 {{ flavour }} 模板变量来仅更改单个模板的某些方面。以下是一个简短的示例

<html>
<head>
    <title>My site {% if flavour == "mobile" %}(mobile version){% endif %}</title>
</head>
<body>
    ...
</body>
</html>

这将在使用激活的 mobile flavour 浏览您的网站时将 (mobile version) 添加到您的网站标题中。

注意: 只有在您已设置 django_mobile.context_processors.flavour 上下文处理器并使用 django 的 RequestContext 作为渲染模板的上下文实例时,flavour 模板变量才是可用的。

更改当前 flavour

django-mobile的基本用法显然是为用户服务一个移动版网站。正确的版本选择通常在调用您的视图时已经由中间件完成。在某些情况下,您可能希望在视图或其他地方更改当前使用的版本。您可以通过简单地调用django_mobile.set_flavour(flavour[, permanent=True])来完成此操作。第一个参数是自我解释的。但请注意,您只能传入也存在于您的FLAVOURS设置中的版本。否则,set_flavour将引发一个ValueError。可选的permanent参数定义了是否将版本的更改记住,以便在相同客户端的未来请求中使用。

您的用户可以自行设置他们想要的版本。他们只需要在向您的网站发出的请求中指定flavour GET参数。这将永久选择这个版本作为他们查看网站的偏好。

您可以使用这个GET参数让用户从您提供的版本中选择

<ul>
    <li><a href="?flavour=full">Get the full experience</a>
    <li><a href="?flavour=mobile">View our mobile version</a>
    <li><a href="?flavour=ipad">View our iPad version</a>
</ul>

缓存注意事项

Django提供了一些方便的方法来轻松缓存您的视图。其中之一是django.views.decorators.cache.cache_page。与django-mobile结合缓存整个页面的问题在于,Django的缓存系统没有意识到版本的存在。这意味着如果页面的第一个请求使用的是移动版本,那么第二个请求也可能从缓存中获得一个使用移动版本的页面渲染——即使第二个请求是由桌面浏览器发出的。

django-mobile自带了一个cache_page的实现来解决这个问题。请使用django_mobile.cache.cache_page而不是Django自己的cache_page装饰器。

您也可以像以前一样使用Django的缓存中间件django.middleware.cache.UpdateCacheMiddlewareFetchFromCacheMiddleware。但要使它们意识到版本,您需要在MIDDLEWARE_CLASSES设置中添加django_mobile.cache.middleware.FetchFromCacheFlavourMiddleware在标准的DjangoFetchFromCacheMiddleware之前,并在相应的位置添加django_mobile.cache.middleware.UpdateCacheFlavourMiddlewaredjango_mobile.cache.middleware.UpdateCacheMiddleware之前。

有必要分开使用CacheMiddleware,因为需要在请求和响应之前执行一些额外的工作,而这在使用两个完整的中间件时是不可能的。

参考

django_mobile.get_flavour([request,] [default])

获取当前活动的版本。如果无法确定版本,则返回default。这可能会发生,如果当前请求-响应周期中尚未调用set_flavour。默认情况下,defaultFLAVOURS设置中的第一个条目。

django_mobile.set_flavour(flavour, [request,] [permanent])

request设置要使用的flavour。如果flavour不在FLAVOURS设置中,这将引发一个ValueError。您可以通过传递permanent=True来尝试将版本永久设置为request。如果不在请求-响应周期中,这可能会失败。默认情况下,request为当前活动的请求。

django_mobile.context_processors.flavour

将当前版本添加为flavour的上下文处理程序。

django_mobile.context_processors.is_mobile

此上下文处理程序将在上下文中添加一个is_mobile变量,如果当前版本等于DEFAULT_MOBILE_FLAVOUR设置,则该变量为True

django_mobile.middleware.SetFlavourMiddleware

负责从用户的会话或cookies(取决于FLAVOURS_STORAGE_BACKEND)加载存储的flavour(如果设置了)。同时将当前请求设置为线程局部变量。这是为了在不访问请求对象的情况下提供get_flavour()功能。

django_mobile.middleware.MobileDetectionMiddleware

检测是否有移动浏览器尝试访问站点,并设置flavour为DEFAULT_MOBILE_FLAVOUR设置的值。

django_mobile.cache.cache_page

与Django的cache_page装饰器相同,但在视图前后包装了额外的装饰器。这使得在没有与Django的不知道flavour的缓存发生冲突的情况下,可以服务多个flavour。

django_mobile.cache.vary_on_flavour_fetch django_mobile.cache.vary_on_flavour_update

FetchFromCacheFlavourMiddlewareUpdateCacheFlavourMiddleware中间件创建的装饰器。

django_mobile.cache.middleware.FetchFromCacheFlavourMiddleware

process_request中向request.META添加X-Flavour头部。

django_mobile.cache.middleware.UpdateCacheFlavourMiddleware

process_response中向response['Vary']添加X-Flavour头部,这样Django的CacheMiddleware在查找缓存的下一个请求的URL内容时,就会考虑这个头部的内容。

自定义

有一些可以让你自定义django-mobile行为的点。以下列出了一些可能性:

MobileDetectionMiddleware

内置的中间件用于检测用户是否使用移动浏览器,在生产环境中表现良好,但远非完美,并且实现方式非常简单。你可以安全地从设置中删除此中间件,并添加自己的版本。只需确保它在某个地方调用django_mobile.set_flavour以设置正确的flavour即可。

设置

以下是django-mobile使用的设置列表,你可以在自己的settings.py中更改这些设置。

FLAVOURS

网站可用的flavour列表。

默认: ('full', 'mobile')

DEFAULT_MOBILE_FLAVOUR

如果内置的MobileDetectionMiddleware检测到移动浏览器,则选择的flavour。

默认: 'mobile'

FLAVOURS_COOKIE_HTTPONLY

传递给HttpResponse.set_cookiehttponly参数的值。如果你想防止JavaScript代码读取flavour cookie,则将其设置为True

默认: False

FLAVOURS_COOKIE_KEY

用于在浏览器中存储所选flavour的cookie名称。仅在FLAVOURS_STORAGE_BACKEND设置为'cookie'时使用。

默认: 'flavour'

FLAVOURS_TEMPLATE_PREFIX

当搜索flavour模板时,此字符串将被添加到模板名称之前。如果你有多个flavour并希望将它们存储在公共子目录中,这将很有用。例如

from django.template.loader import render_to_string
from django_mobile import set_flavour

set_flavour('mobile')
render_to_string('index.html') # will render 'mobile/index.html'

# now add this to settings.py
FLAVOURS_TEMPLATE_PREFIX = 'flavours/'

# and try again

set_flavour('mobile')
render_to_string('index.html') # will render 'flavours/mobile/index.html'

默认: ''(空字符串)

FLAVOURS_TEMPLATE_LOADERS

django-mobile的模板加载器可以加载带有当前flavour的前缀的模板。使用此设置指定用于加载flavour模板的加载器。

默认:TEMPLATE_LOADERS设置相同,但不包括'django_mobile.loader.Loader'

FLAVOURS_GET_PARAMETER

用户可以通过HTTP GET参数更改他们想要查看的口味。此参数的名称由以下内容确定。将其设置为None以禁用。

默认: 'flavour'

FLAVOURS_SESSION_KEY

用户使用GET参数设置的偏好存储在用户的会话中。此设置确定使用哪个会话密钥来保存此信息。

默认: 'flavour'

FLAVOURS_STORAGE_BACKEND

确定如何持久化存储所选口味。可用值:'session''cookie'

默认: 'cookie'

缓存设置

Django自带了缓存模板加载器 django.template.loaders.cached.Loader,在渲染模板时无需每次从磁盘检索模板。然而,它并不了解django-mobile的口味。为此,您可以使用'django_mobile.loader.CachedLoader'作为直接替换品,它执行与django版本相同的操作,但考虑了不同的口味。要使用它,请将以下内容放入您的settings.py文件中

TEMPLATE_LOADERS = (
    ('django_mobile.loader.CachedLoader', (
          'django_mobile.loader.Loader',
          'django.template.loaders.filesystem.Loader',
          'django.template.loaders.app_directories.Loader',
    )),
)

变更日志

0.7.0

  • #64:修复cache_page装饰器和将CacheFlavourMiddleware拆分为两个中间件。这遵循了Django长期以来所采取的策略。请参阅#64以获取更多关于为什么这样做是必要的详细信息。

    如果您正在使用CacheFlavourMiddleware,您现在需要将其替换为FetchFromCacheFlavourMiddlewareUpdateCacheMiddleware。请查阅README以获取更多信息。

    感谢Yury Paykov提供的补丁。

0.6.0

  • #63:支持Django 1.9。感谢Alexandre Vicenzi提供的补丁。

0.5.1

  • #58:修复与Unicode字符串相关的Python 3安装问题。感谢Zowie启发补丁。

0.5.0

  • 支持Django 1.7和Django 1.8。感谢José Ignacio Galarza和Anton Shurashov提供的补丁。

0.4.0

  • Python 3.3兼容性,感谢Mirko Rossini提供的补丁。

  • 放弃对Django 1.3和1.4的支持。

0.3.0

  • 放弃对python 2.5的支持(它可能仍然可以工作,但我们不会再对其进行测试)。

  • 修复由于错误使用threading.local而导致的线程问题。感谢Mike Shultz提供的补丁。

  • 添加了缓存模板加载器。感谢Saverio提供的补丁。

0.2.4

  • 修复:Cookie后端实际上从未真正工作过。感谢demidov91的报告。

0.2.3

  • 修复:在所有情况下设置flavour,而不仅仅是检测到移动浏览器时。感谢John P. Kiffmeyer的报告。

0.2.2

  • 修复:Opera Mobile在Android中被归类为移动浏览器。感谢dgerzo的报告。

  • 嗅探iPad,使其不被识别为小型移动设备。感谢Ryan Showalter提供的补丁。

0.2.1

  • 修复了未包括django_mobile.cache包的打包问题。感谢Scott Turnbull的报告。

0.2.0

  • 重构项目布局,从顶层目录中删除settings.py和manage.py。这解决了使用pip的-e选项安装时模块名称冲突的问题。感谢bendavis78的报告。

  • 添加了一个cache_page装饰器,它模拟django的cache_page,但考虑了口味。否则,缓存系统会在缓存未命中时缓存当前活动口味。感谢itmustbejj的报告。

  • 添加了一个CacheFlavourMiddleware,它使django的缓存中间件了解口味。我们内部使用Vary响应头和X-Flavour请求头。

0.1.4

  • 修复了模板加载器的问题,该加载器仅实现了 load_template_source 而没有实现 load_template。感谢 tylanpince、rwilcox 和 Frédéric Roland 提供的报告。

0.1.3

  • 修复了 runserver 命令的问题,该命令没有处理所有相互独立的请求。感谢 bclermont 和 Frédéric Roland 提供的报告。

0.1.2

  • 修复了 SetFlavourMiddleware 中的未引用变量错误。

0.1.1

  • 修复了 django_mobile.loader.Loaderis_usable 属性。感谢 Michela Ledwidge 提供的报告。

0.1.0

  • 初始发布。

项目详情


下载文件

下载适用于您平台的文件。如果您不确定选择哪个,请了解更多关于 安装包 的信息。

源代码分发

django-mobile-0.7.0.tar.gz (19.2 kB 查看散列值)

上传时间 源代码

支持者