跳转到主要内容

为Django提供基于请求上下文切换模板的机制。

项目描述

我们经常希望为手机、平板电脑和桌面浏览器渲染不同的HTML模板。或者进行AB测试。 django-variabtempl 使之变得简单。通过设置 request.variant,您可以根据该 request.variant 渲染模板。这个库深受 Action Pack Variants 的启发。

travis coveralls.io latest version license

快速入门

  1. 安装 django-variabtempl

$ pip install django-variantmpl
  1. 在您的视图中将 django.shortcuts.render 更改为 variantmpl.shortcuts.render

  • 并设置 request.variant 属性。

# views.py --

# from django.shortcuts import render
from variantmpl.shortcuts import render # <- add

def sample(request):

    # Set variant value
    request.variant = 'v2'

    return render(request, 'index.html')
  1. 准备变体模板。

$ echo 'sample v1' > templates/index.html
$ echo 'sample v2' > templates/index+v2.html
  1. 在浏览器中确认 views.sample 的显示。

  • 您可以看到 sample v2

  • 这是根据 request.variant 加载模板(index+v2.html)的结果。

功能

渲染

代替 django.shortcuts.render 使用。

# views.py --

from variantmpl.shortcuts import render

def sample(request):
    request.variant = 'v2'

    # Actually "index+v2.html" is rendered
    return render(request, 'index.html')

render_to_response

代替 django.shortcuts.render_to_response 使用。

# views.py --

from variantmpl.shortcuts import render_to_response

def sample(request):

    # Actually "index+v2.html" is rendered
    return render_to_response(request, 'index.html', variant='v2')

您可以将 variant 作为关键字参数设置。

render_to_string

请使用 django.template.loader.render_to_string 代替。

# views.py --

from django.http import HttpResponse

from variantmpl.template.loader import render_to_string

def sample(request):
    request.variant = 'v2'

    # Actually "index+v2.html" is rendered
    content = render_to_string('index.html', request=request)
    return HttpResponse(content)

TemplateResponse

请使用 django.template.response.TemplateResponse 代替。

# views.py --

from django.views.generic import TemplateView
from variantmpl.template.response import TemplateResponse

class SampleView(TemplateView):
    template_name = 'sample/index.html'
    response_class = TemplateResponse # Replace response class

    def get(self, request, **kwargs):
        request.variant = 'v2'

        # Actually "index+v2.html" is rendered
        return super().get(request, **kwargs)

sample = SampleView.as_view()

Django函数/类的猴子补丁

难以将所有现有代码重写为 variantmpl 代码。在这种情况下,您可以对Django的函数/类应用猴子补丁。

注意:此功能为实验性。如果发生意外的不良影响,将来可能会删除此功能。

# settings.py --

SECRET_KEY = 'xxxxxx'

# You must write this code below SECRET_KEY.
from variantmpl import monkey
monkey.patch_all()
# views.py --

# You don't need to replace to 'variantmpl'.
from django.shortcuts import render

def sample(request):
    request.variant = 'v2'

    # Actually "index+v2.html" is rendered
    return render(request, 'index.html')

所有猴子补丁的目标。

django.shortcuts.render
django.shortcuts.render_to_response
django.template.loader.render_to_string
django.template.response.TemplateResponse.resolve_template

They are replaced by the functions/methods of the same name in `variantmpl`.

配置

VARIANTMPL_VARIANT_FORMAT

您可以更改 variant 格式。默认:+variant

# settings.py --
VARIANTMPL_VARIANT_FORMAT = '@{variant}'
# The lookup target template name changes as follows.

"index+variant.html" -> "index@variant.html"

VARIANTMPL_PROPERTY_NAME

您可以重命名 request.variant 属性。

# settings.py --
VARIANTMPL_PROPERTY_NAME = 'mutation'
# You can set 'mutation' instead of 'varaiant'
request.mutation = 'v2'

VARIANTMPL_TEMPLATE_FORMAT

您可以更改插入到模板路径中的变体位置。

# For example, you have this path.
render('sample1/sample2/index.html')

# variantmpl inserts the variant(v2) as follows.
'sample1/sample2/index+v2.html'

# At this time, VARIANTMPL_TEMPLATE_FORMAT is like this. (default)
VARIANTMPL_TEMPLATE_FORMAT = '{dirpath}{filename}{variant}.{ext}'
dirpath  # => 'sample1/sample2/'
filename # => 'index'
variant  # => '+v2'
ext      # => 'html'

按此方式更改此格式。

VARIANTMPL_TEMPLATE_FORMAT = '{variant}/{dirpath}{filename}.{ext}'

# variantmpl inserts the variant(v2) as follows.
'+v2/sample1/sample2/index.html'

在这种情况下,模板布局将按以下方式更改

templates
  ├── +v2
  │   └── sample1
  │       └── sample2
  │           └── index.html
  └── sample1
      └── sample2
          └── index.html

Python和Django支持

  • Python 3.4及以后版本

  • Django 1.10及以后版本

  • 仅支持最新3个版本。

许可证

MIT许可。有关具体条款,请参阅LICENSE文件。

历史

0.1.0(12 26, 2017)

  • 首次发布

项目详情


下载文件

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

源分发

django-variantmpl-0.1.0.tar.gz (9.0 kB 查看散列)

上传时间

构建分发

django_variantmpl-0.1.0-py3-none-any.whl (9.5 kB 查看散列)

上传时间 Python 3

由以下支持

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