每个用户的模板、静态和url重写。

django-finial的Python项目详细描述


Django Finial公司[不打算维护](http://unmaintained.tech/badge.svg)](http://unmaintained.tech/)


按请求覆盖分层模板。

**不推荐通知:**此项目不再主动维护,并且不会为以后的django版本更新。您可能对类似的项目感兴趣,例如
[django华夫饼][]或[gargoyle][.

[django华夫饼]:https://waffle.readthedocs.io/en/latest/
[gargoyle]:https://gargoyle.readthedocs.io/en/latest/


defin.i.al
`/fin_l/`
*名词*

![alt text](finial.png"建筑中的finial示例"。)

1.在屋顶、尖顶、树冠或类似结构的顶端的一种独特的装饰物。对象顶部、末端或角落的装饰品,如柱子、家具等。


因此"装饰"现有模板层次结构的
"顶部"。


----



当您无法或不愿意部署多个版本的软件堆栈以获得A/B时,这尤其好。这允许您在同一分支/签出上执行所有的A/B测试。




finial在请求/响应周期的中间层工作。
如果request.user登录并定义了覆盖,finial将重新安排
staticfiles和template dirs的顺序,以便在"默认"资源之前加载它们的资源。

还有其他功能可供您覆盖视图的url路径,模板标记可指定模板中某些资产的url,以及帮助程序可构建urlconf
设置,以便在本地承载所有覆盖的静态资产。

它易于安装,但是可以非常定制。

元组
(会话和身份验证后的某个位置)
*将"finial.context-processors.asset-url``添加到"template-context-processors"元组中。
*运行"python manage.py migrate``以获取迁移和表创建

这允许覆盖模板加载。但它只会让您到目前为止——您可能需要
有一个finial的覆盖前缀来查找template目录。

_ templates/```

``python
finial\u template\u dir\u prefix='/overrides'\this is the directory prefix from your project\u path
```
参见``example\u settings.py``了解其他常用设置完成工作:

1。模板覆盖——短接模板加载程序以首先加载覆盖的模板。
2.urlconf overrides——创建一个request.urlconf,将覆盖url模式放在第一位。
3。staticfiles overrides——短路staticfiles加载程序从override dirs加载内容。

**模板覆盖**

这是三种机制中最直接的。基本上,它利用了django
将返回第一个其名称与视图的响应构造函数所请求的名称匹配的模板。它通过在finial的"中间件"中根据每个请求对设置中的"template dirs"的顺序进行乱序来实现
。finial将
查找启用了覆盖的用户;当找到这些用户时,它将接受给定用户的所有覆盖,并按照覆盖优先级顺序重新排列"template\u dirs"的目录结构。

priority,在我们的例子中,假设lower更重要。因此,优先级为1的重写应该总是胜出。

**urlconf overrides**


这些比较复杂,但是当需要对给定url端点的视图逻辑进行基本更改时,可以选择使用它们。它允许您(同样基于每个请求)无序排列urlpatterns的顺序,以便
可以使用重写视图来代替给定url模式的默认视图。

我们使用django机器来执行此操作,该机器检查每个请求对象的"request.urlconf"属性。如果找到
,则忽略根urlconf。

finial知道如何设置此请求。urlconf方法是查看
``settings.py``中的override urlconf模块(必须是它自己的模块)路径。我们寻找urlconf导入字符串的重写名称字典,如下所示:

`` python


finial\u url\u overrides={
'my\u override':'my\u project.my\u override\u finial\u patterns'
}
````

**staticfiles overrides**

奇怪的是,这是最复杂的三种情况。虽然传统的http服务器设计时只考虑静态内容,但django高度动态的特性使其与静态媒体格格不入。

在开发过程中,我们需要django,因此服务
我们的内容。在生产中,我们通常有完全由不同域(s3、cdn等)托管的静态媒体。为了解决这些差异,我们有两种助手方法来进行排序:

**使用静态文件覆盖的本地开发**


在这种情况下,人们通常设置自定义django url端点,以便从其
项目的签出中为静态媒体提供服务本地。

`` python
如果设置。调试:
url patterns+=模式('',
url(r'^static/(?p<;path>;*)$','django.views.static.serve',{
'document\u root':settings.media\u root}),

````

我们需要一个单独的url端点:

``python


if settings.debug:

url(r'^static/(?p<;path>;*)$','django.views.static.serve',{
'文档根':设置.媒体根',

```
您会注意到,无论您是在本地开发还是在生产中工作,很大程度上都是由``settings.debug``标志决定的。
如果您为此使用其他变量,请确保它模拟debug。

要使静态媒体正确加载以用于本地开发,还必须做一件事。
请确保在"settings.staticfiles\u finders"前面加上"finial.finders.finialfilesystemfinder"。

静态文件配置:

``python

debug=true
project_path='/path/to/django/root/'
finial_url_version_prefix='deploy5-'
finial_static_url_prefix='https://s3.amazonaws.com/com.finial.media'
finial_template_dir prefix='/overrides'
staticfiles_finders=(
finial.finders.finial filesystemfinder',
django.contrib.staticfiles.finders.filesystemfinder',
django.contrib.staticfiles.finders.appdirectoriesfinder',

```

上面例子中的"根"覆盖目录
应该是```/path/to/django/root/overrides/```.


**staticfiles覆盖的产品**

在这种情况下,不使用本地路径,
我们使用``settings.finial_static_url_prefix````````创建一个url,覆盖名和可选的部署版本(
使用``settings指定。finial_url_version_prefix````

这些资产的url由模板上下文决定我们在"设置"中安装的处理器。模板上下文处理器从一开始就安装了。



**目录结构**


,因为模板和静态文件是完全不同的,我们将它们保存在单独的目录结构中。

```
~/path/to/django/overrides/$tree

——测试或静态文件——应用程序通过在settings.py:
`` python
`` python
` finial静态url='静态url='静态url/'
finial url='覆盖/'
``````
,您实际上可以将静态媒体放入静态媒体测试中的'chroot'中,然后就可以有一个目录结构就像这样:
```
~/path/to/django/static$tree
static/
——覆盖
——测试或
——应用程序
——配置image.png
——docs image.png

3个目录,2个文件
```

这特别好,因为它使我们能够区分同一CDN上的重写。
我们不需要为每个重写部署到单独的S3存储桶。

创建**
简单、直接的方法是使用管理界面输入表单字段。
这对于添加单个个人或在开发环境中设置测试覆盖非常有用。




覆盖表中的每一行都定义了四个内容:

-谁
-覆盖的名称(用于urlconf keynames,etc.)
-覆盖的目录路径(可以与"finial\u template\u dir\u prefix"一起使用)。
-优先级(该覆盖应如何与其他覆盖进行比较?)

**编程重写创建**

这主要是文件系统和一些配置。如果您已经完成了上述设置分配,那么我们就更进一步了。

我们可以创建这样的结构:

```bash
mdkir$project\u root/overrides/test\u override\u template
```

对于那些拥有覆盖的用户,应该在
"常规"模板之前获取这些模板。

**将覆盖分配给用户**

从django.contrib.auth.models导入user
>;>me=user.objects.get(username='gavin')\whicher username here.
>;>my\u override=models.usertemplateoverride()
>;>my\u override.user=me
>;my_override.priority=10以防以后有更多的覆盖
>;这两个在我们的系统中始终是相同的;我们可能有一天会取消一个…
>;>my挈u override.override_u name='测试覆盖'
>;>我的覆盖。override"dir="test"override"
>;>;my"override.save()
````

>现在以此用户身份登录,在本例中为``gavin`,并查看为该用户加载的模板是否与您预期的不同。




生成结果:上下文处理器
向用户呈现模板数据中的差异有两种主要方法。这两种方法都使用了django的上下文处理器。像这样的,您需要确保试图覆盖的视图为模板提供了一个"requestcontext"上下文类型(现在是"http.render()"的默认值)。



**如果您只需要修改"media url",则使用asset url更改媒体url**

``静态url``,那么您需要使用``资产url``.

``资产url``假定您有一个请求上下文(因为我们在请求对象上附加了一些数据,关于这些数据,我们正在选择覆盖)。在模板中链接到的静态媒体与网站其他部分的静态媒体不同的情况下,将使用此方法。它有两部分工作;
首先,您需要使用decorator定义给定视图的哪个覆盖是"活动的";其次,您需要确保"asset\u url"上下文处理器已设置(只需要发生一次)。
通常,当您执行"url conf"覆盖时,这是必需的。

视图:
`` python

**kwargs)

```

使用override_names的重写**

有时您的javascript代码将与django部署完全分离。在这种情况下,
你不能依赖finial来做正确的事情。相反,finial只需通知
javascript代码,给定用户可以使用哪些重写。为此,我们使用``覆盖名称`
上下文处理器。

考虑以下模板代码(注意:这意味着始终为站点呈现,而不仅仅是在覆盖中呈现)。

``html
{%if finial\u points%}
<;div id="finial"数据集="{{{finial\u points}">;/div>;
{%endif%}
```


这样,javascript获取一个字符串,它可以使用json解析器解析该字符串,以获取覆盖名称列表(按优先级顺序),
,并可以选择要包含/运行的函数或要呈现的模板。

欢迎加入QQ群-->: 979659372 Python中文网_新手群

推荐PyPI第三方库


热门话题
在java中将字符串转换为音频输入   java如何使用Spring Boot RestTemplate解组json列表   计算机上C++ OpenCV项目转换为OpenCV Android的java步骤   Java Spring Telegraf数据表不工作   openurlconnection与connect之间的java差异?   java Solr字段搜索、通配符和转义字符   java如何使用DLFolderLocalServiceUtil类的getFolders()方法?   尝试用Java编写文件   java连续双缓冲解决方案不起作用   两个数组的Java乘积   java Jackson,如何正确编写自定义反序列化程序   java将布尔标志按一定顺序排列以获得更好的性能是否有意义   java Vaadin无缓冲网格无法关闭   java在MySQL中以同一用户身份同时从不同客户端登录安全吗?   java如何使用安卓asynchttp库   java无法在Android中使用AlarmManager停止服务   java在Hibernate的XML配置文件中指定默认值   Spring启动应用程序中的java内存SQLITE不工作   Java代码无法写入文本文件,