为 Django 提供一种基于请求上下文切换模板的机制。
项目描述
我们经常希望为手机、平板电脑和桌面浏览器呈现不同的 HTML 模板。或用于 AB 测试。django-variatmpl 让它变得简单。通过设置request.variant,您可以根据该request.variant呈现模板。这个库深受Action Pack Variants的启发。
快速开始
安装django-variantmpl
$ 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在您的浏览器中显示。
您可以查看示例 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')
您可以将变体设置为关键字参数。
渲染到字符串
使用而不是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)
模板响应
使用而不是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代码。在这种情况下,您可以将 Monkey 补丁应用于 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
您可以更改变体格式。默认值:+变体。
# 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 个版本。
执照
麻省理工学院执照。有关特定条款,请参阅 LICENSE 文件。
历史
0.1.0(2017 年 12 月 26 日)
首次发布
项目详情
django_variantmpl -0.1.0-py3-none-any.whl 的哈希值
| 算法 | 哈希摘要 | |
|---|---|---|
| SHA256 | 28cbb33ef9d7db1ec3b1e7ac342d1ef5ec4340c79b07198df296136b32836d12 |
|
| MD5 | e5af78534e32ec0e2de743db082b70cc |
|
| 布莱克2-256 | 4d5802ea6c085df5993b573c505636a72e8589b8d02b9245f1085583e21aa229 |