为Django提供基于请求上下文切换模板的机制。
项目描述
我们经常希望为手机、平板电脑和桌面浏览器渲染不同的HTML模板。或者进行AB测试。 django-variabtempl 使之变得简单。通过设置 request.variant,您可以根据该 request.variant 渲染模板。这个库深受 Action Pack Variants 的启发。
快速入门
安装 django-variabtempl
$ pip install django-variantmpl
在您的视图中将 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')
准备变体模板。
$ echo 'sample v1' > templates/index.html
$ echo 'sample v2' > templates/index+v2.html
在浏览器中确认 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的散列
算法 | 散列摘要 | |
---|---|---|
SHA256 | 18474b9d5a0770835e335cd651bce7b6f4ae8799be4a019a40680b03fc7825d4 |
|
MD5 | 1f1e03b2ceffaf1560996298dc5cc85a |
|
BLAKE2b-256 | f64ae6b0654bc6b13b8ee4d96c91d6d10025b7eb594e4ad8d9cc3bc30168b211 |
django_variantmpl-0.1.0-py3-none-any.whl的散列
算法 | 散列摘要 | |
---|---|---|
SHA256 | 28cbb33ef9d7db1ec3b1e7ac342d1ef5ec4340c79b07198df296136b32836d12 |
|
MD5 | e5af78534e32ec0e2de743db082b70cc |
|
BLAKE2b-256 | 4d5802ea6c085df5993b573c505636a72e8589b8d02b9245f1085583e21aa229 |