为mobi和web等不同的模板和静态文件提供服务。层可以堆叠以实现资源重用。
项目描述
Django Layers
Travis
Django Layers使您能够为在settings.py中定义的一组模板和静态资源提供服务。这意味着您可以为例如基本移动设备、智能手机和桌面浏览器提供不同的HTML、JavaScript和CSS。这些模板集(也称为层)也可以堆叠,因此如果您为基本设备创建了foo.html,它也会自动对桌面浏览器可用。您可以覆盖桌面浏览器的foo.html。
安装
将django-layers-hr安装或添加到Python路径。
在您的 INSTALLED_APPS 设置中在 django.contrib.static 之后添加 layers。
确保您要为它创建层的应用在 INSTALLED_APPS 中排在第一位,否则模板覆盖将不会工作。
示例
注意:在 example 子目录中有一个工作示例。
我们拥有 sites example.com、basic.example.com 和 smart.example.com。每个站点都有自己的 settings.py,因此有不同的 Django 进程。
目录结构
templates - basic - foo.html (1) - bar.html (2) - smart - bar.html (3) - web - bar.html (4) static - basic - foo.css (5) - bar.css (6) - smart - bar.css (7) - web - bar.css (8)
设置
我们使用列表的列表表示法定义了一个“继承”层次结构。
两条继承线:basic-smart 和 basic-web
LAYERS = {'tree': ['basic', ['smart'], ['web']]}
一条继承线:basic-smart-web。
LAYERS = {'tree': ['basic', ['smart', ['web']]]}
有两种方法可以为系统配置层查找:在设置文件中指定当前层或从请求中查找它。省略 current 键将启用基于请求的查找
LAYERS = {'tree': ['basic', ['smart'], ['web']], 'current': 'web'}
旧版设置需要将层定义在不同的设置文件中。下面的示例意味着我们有三个设置文件,因此有三个 Django 进程。请迁移到默认的 tree 格式。
桌面设置具有 LAYERS = {'layers': ['basic', 'web']}。
基本设置具有 LAYERS = {'layers': ['basic']}。
智能设置具有 LAYERS = {'layers': ['basic', 'smart']}。
将加载器和查找器添加到设置中。顺序很重要。
INSTALLED_APPS = ( 'myapp', 'layers', ... ) TEMPLATE_LOADERS = ( 'layers.loaders.filesystem.Loader', 'django.template.loaders.filesystem.Loader', 'layers.loaders.app_directories.Loader', 'django.template.loaders.app_directories.Loader', ) STATICFILES_FINDERS = ( 'layers.finders.FileSystemFinder', 'django.contrib.staticfiles.finders.FileSystemFinder', 'layers.finders.AppDirectoriesFinder', 'django.contrib.staticfiles.finders.AppDirectoriesFinder', )
模板结果
http://example.com/foo 产生(1)。
http://example.com/bar 产生(4)。
http://basic.example.com/foo 产生(1)。
http://basic.example.com/bar 产生(2)。
http://smart.example.com/foo 产生(1)。
http://smart.example.com/foo 产生(3)。
静态结果
覆盖其他应用的模板
正常模板解析规则适用。例如创建 templates/web/registration/login.html 将只覆盖 web 的登录页面。
Collectstatic
Collectstatic 不会受到影响。收集器将委派给查找器,因此所有层感知资源最终都位于 STATIC_ROOT 目录下的部分路径。
装饰器
用户可能会点击一个链接,将其带到提供有损坏页面的层。例如,一个网站在 www.site.com 上提供,附带一个基本网站 m.site.com。使用基本设备(如三星 E250)访问 www.site.com/flashy-dashboard 将导致用户被重定向到 m.site.com/flashy-dashboard。该页面可能不存在于基本设备上,因为它无法很好地渲染它。在这种情况下,提供了一个名为 exclude_from_layers 的装饰器,该装饰器会渲染一个友好的页面而不是 404 或 500 错误
class WebOnlyView(TemplateView): template_name = "layers/web_only_view.html" @exclude_from_layers(layers=("basic",)) def get(self, *args, **kwargs): return super(WebOnlyView, self).get(*args, **kwargs)
基于请求的层查找
层查找的首选方法是请求中存在一个 X-Django-Layer 标头。Django Layers 层查找与在 django.contrib.sites 中执行的站点对象查找非常相似。如果设置中明确定义了层,则使用该层,否则检查请求头。
在开发期间,您可能会在您的设置文件中定义层,但在生产环境中,您不希望每个层都有一个 Django 进程,因此基于请求的查找更受青睐。
层对象
管理命令 load_layers 为项目中的每个图层创建一个 Layer 对象。它在数据库级别进行基于图层的过滤非常有用。
我可以添加自己的图层吗?
是的!基本、智能和网页只是示例。您可以使用任何名称定义任何层次结构。
变更日志
1.11.1
在 get_current_layer_stack() 请求为空时防止 KeyError。
1.11.0
Django 1.11 兼容性。
1.10.1
修复文档中的错别字。
添加 layers_collectstatic 管理命令以进行具有图层意识的静态文件收集。
1.10.0
Django 1.10 兼容性。
使能够从请求中确定图层。这消除了每个图层需要一个 Django 进程的需求。
1.9
取消 Django 1.6 兼容性。支持并测试 Django 1.9。
0.5.1
重新编写装饰器以基于函数,因为它使在 urls.py 中使用它更容易。
0.5
提供装饰器 exclude_from_layers,即使视图无法为特定图层渲染,视图也能正确渲染。
0.4
删除冗余的 collectstatic 管理命令。
0.3
扩展测试。
修复了一个错误,即无法在图层中覆盖未在图层中定义的静态文件。
提供具有图层意识的 collectstatic 替代方案。
0.2
不可避免地重命名软件包。
0.1
初始发布。
项目详情
下载文件
下载适合您平台的文件。如果您不确定要选择哪个,请了解有关 安装包 的更多信息。