跳转到主要内容

为mobi和web等不同的模板和静态文件提供服务。层可以堆叠以实现资源重用。

项目描述

Django Layers

Travis

Travis


Django Layers使您能够为在settings.py中定义的一组模板和静态资源提供服务。这意味着您可以为例如基本移动设备、智能手机和桌面浏览器提供不同的HTML、JavaScript和CSS。这些模板集(也称为层)也可以堆叠,因此如果您为基本设备创建了foo.html,它也会自动对桌面浏览器可用。您可以覆盖桌面浏览器的foo.html。

安装

  1. django-layers-hr安装或添加到Python路径。

  2. 在您的 INSTALLED_APPS 设置中在 django.contrib.static 之后添加 layers

  3. 确保您要为它创建层的应用在 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',
)

模板结果

静态结果

覆盖其他应用的模板

正常模板解析规则适用。例如创建 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 对象。它在数据库级别进行基于图层的过滤非常有用。

我可以添加自己的图层吗?

是的!基本、智能和网页只是示例。您可以使用任何名称定义任何层次结构。

作者

  • Hedley Roos

  • Altus Barry

变更日志

1.11.1

  1. 在 get_current_layer_stack() 请求为空时防止 KeyError。

1.11.0

  1. Django 1.11 兼容性。

1.10.1

  1. 修复文档中的错别字。

  2. 添加 layers_collectstatic 管理命令以进行具有图层意识的静态文件收集。

1.10.0

  1. Django 1.10 兼容性。

  2. 使能够从请求中确定图层。这消除了每个图层需要一个 Django 进程的需求。

1.9

  1. 取消 Django 1.6 兼容性。支持并测试 Django 1.9。

0.5.1

  1. 重新编写装饰器以基于函数,因为它使在 urls.py 中使用它更容易。

0.5

  1. 提供装饰器 exclude_from_layers,即使视图无法为特定图层渲染,视图也能正确渲染。

0.4

  1. 删除冗余的 collectstatic 管理命令。

0.3

  1. 扩展测试。

  2. 修复了一个错误,即无法在图层中覆盖未在图层中定义的静态文件。

  3. 提供具有图层意识的 collectstatic 替代方案。

0.2

  1. 不可避免地重命名软件包。

0.1

  1. 初始发布。

项目详情


下载文件

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

源分布

django-layers-hr-1.11.1.tar.gz (16.1 kB 查看哈希值)

上传时间

构建分布

django_layers_hr-1.11.1-py2.7.egg (55.0 kB 查看哈希值)

上传时间

由以下支持

AWS AWS 云计算和安全赞助商 Datadog Datadog 监控 Fastly Fastly CDN Google Google 下载分析 Microsoft Microsoft PSF 赞助商 Pingdom Pingdom 监控 Sentry Sentry 错误日志 StatusPage StatusPage 状态页面