检测移动浏览器并向其提供不同的模板版本。
项目描述
django-mobile 提供了一种简单的方法来检测移动浏览器,并为您提供工具来渲染不同的模板,以向用户提供移动版网站。
想法是保持视图完全相同,但透明地交换用于渲染响应的模板。这是通过两个步骤完成的
中间件确定客户端查看您的网站的偏好。例如,如果他想使用移动版或完整桌面版。
模板加载器随后负责根据中间件中检测到的版本选择正确的模板。
安装
预-要求: django_mobile 依赖于django的会话框架。因此,在尝试使用 django_mobile 之前,请确保会话框架已启用且正常工作。
使用您喜欢的Python工具安装 django_mobile,例如使用 easy_install django_mobile 或 pip install django_mobile。
将 django_mobile 添加到 settings.py 文件的 INSTALLED_APPS 设置中。
将 django_mobile.middleware.MobileDetectionMiddleware 添加到您的 MIDDLEWARE_CLASSES 设置。
将 django_mobile.middleware.SetFlavourMiddleware 添加到您的 MIDDLEWARE_CLASSES 设置中。确保它在 MobileDetectionMiddleware 和 SessionMiddleware 之后列出。
将 django_mobile.loader.Loader 作为第一个元素添加到您的 settings.py 文件的 TEMPLATE_LOADERS 列表中。
将 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 只区分 full 和 mobile 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.UpdateCacheMiddleware和FetchFromCacheMiddleware。但要使它们意识到版本,您需要在MIDDLEWARE_CLASSES设置中添加django_mobile.cache.middleware.FetchFromCacheFlavourMiddleware在标准的DjangoFetchFromCacheMiddleware之前,并在相应的位置添加django_mobile.cache.middleware.UpdateCacheFlavourMiddleware在django_mobile.cache.middleware.UpdateCacheMiddleware之前。
有必要分开使用CacheMiddleware,因为需要在请求和响应之前执行一些额外的工作,而这在使用两个完整的中间件时是不可能的。
参考
- django_mobile.get_flavour([request,] [default])
获取当前活动的版本。如果无法确定版本,则返回default。这可能会发生,如果当前请求-响应周期中尚未调用set_flavour。默认情况下,default是FLAVOURS设置中的第一个条目。
- 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
由FetchFromCacheFlavourMiddleware和UpdateCacheFlavourMiddleware中间件创建的装饰器。
- 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_cookie的httponly参数的值。如果你想防止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
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.Loader 的 is_usable 属性。感谢 Michela Ledwidge 提供的报告。
0.1.0
初始发布。
项目详情
django-mobile-0.7.0.tar.gz 的散列值
算法 | 散列值 | |
---|---|---|
SHA256 | 3420dc10a199a9f65acadb1243fb539e3045ee51fa6f5031ee57831b19713b86 |
|
MD5 | 63aa8ee2d0613227866492f32963a4fe |
|
BLAKE2b-256 | db0e956f3070bbfa00ba66839710dbefcea81193a6710a759ea5c3e0947f8c21 |