跳转到主要内容

中间件,允许根据传入的HTTP头灵活选择Diazo主题。扩展了Diazo的功能。

项目描述

简介

“什么是Diazo?”,你可能会问。来自 diazo.org

Diazo允许您将包含在静态HTML网页中的主题应用于使用任何服务器端技术创建的动态网站。使用Diazo,您可以拿一个网页设计师创建的HTML线框图,将其转换为您喜欢的CMS的主题,无需访问原始源代码即可重新设计遗留Web应用程序的用户界面,或者只需几小时即可在多个不同的系统中构建统一用户体验。

使用Diazo时,您将使用来自HTML和CSS的工作语法和概念。通过允许您无缝地将XSLT集成到规则文件中,Diazo使常见情况简单,并使复杂需求成为可能。

关于此包

此包扩展了Diazo的标准主题中间件,以添加从WSGI环境读取规则XML文件位置的功能。这意味着,除了能够从环境读取本地用户的规则位置外,上游服务(如Web服务器、反向代理、缓存代理等)能够控制中间件使用的主题,并为任何请求更改它。这与Diazo标准中间件采用的基于配置的方法形成对比,后者需要指定中间件的固定路径。

因此,这意味着,通过正确的WSGI配置,您可以想象在不需要显式配置路径、urlmaps之类的设置的情况下,让一个Diazo实例服务于任意数量的主题。如果您结合一个合适的前端工具(例如,如Apache、Nginx、Cherokee或其他可配置的Web服务器),那么您可以拥有这个单一的Diazo实例为主题任意数量的应用程序,并根据您的Web服务器支持的条件(例如,传入的主机名、HTTP vs HTTPS、特定URL或正则表达式、头部、IP地址等)进行不同的主题设计。为了实现这一点,您只需设置正确的HTTP头部——即您规则文件的路径——并确保根据您各种条件将其发送到您的中间件。

示例

在本例中,我们可以将这个扩展的Diazo中间件部署为在Web服务器后面作为通用主题后端。使用正确的WSGI管道,我们可以有一个WSGI管道服务任意数量的后端,服务任意数量的不同主题,而无需任何显式的WSGI配置。请记住,存在头欺骗的可能性——请务必小心谨慎。

WSGI管道

以下是为PasteScript准备的配置

[server:main]
use = egg:Paste#http
host = 0.0.0.0
port = 5000

[composite:main]
use = egg:Paste#urlmap
/ = default

[pipeline:default]
pipeline = theme
           proxy

[filter:theme]
use = egg:collective.diazo.readheaders
#You can use any other Diazo middleware options here, too!
read_network = True
debug = True

[app:proxy]
use = egg:djb.headerproxy

http://docs.diazo.org/en/latest/quickstart.html标准Diazo/WSGI配置中,细心的读者会注意到以下内容

  1. 我们使用collective.diazo.readheaders而不是diazo——这允许从传入的WSGI环境中读取X-Diazo-Rules头部并将其用作传统的rules选项。这意味着如果设置为这个头部,任何rules选项接受的格式(例如基于网络的URL)都将有效。在特定情况下,对于网络URL,您需要配置read_network启用。

    本节自动接受任何选项并添加Diazo的功能:请参阅http://docs.diazo.org/en/latest/deployment.html#wsgi——我们上面已经展示了这一点。

  2. 我们使用特殊的WSGI代理djb.headerproxy,该代理将基于传入的头部反向代理到任意位置。相比之下,标准的Paste代理需要在配置中显式定义地址。根据djb.headerproxy的文档,上游的头部默认情况下期望是X-Proxy-Force-HostX-Proxy-Force-Scheme——这个映射是可配置的。

前端

现在,在我们的前端服务器中,我们可以配置我们的反向代理并相应地设置头部。例如,使用Apache,您可能做以下操作

RequestHeader set "X-Diazo-Rules" "/path/to/rules.xml"
RequestHeader set "X-Proxy-Force-Host" "app-server.example.com:8080"
RequestHeader set "X-Proxy-Force-Scheme" "http"
RewriteRule / https://127.0.0.1:5000 [L,P]

其中,重写规则指向运行上述Paste WSGI配置的服务位置。

别忘了,X-Diazo-Rules选项将在运行WSGI管道的本地计算机上被解释。所以,如果您引用本地文件,它将是该机器的本地文件。如果您在相同的机器上运行Diazo,这一点无足轻重——但仍然应该强调。还要记住,您可以配置像这样的选项

RequestHeader set X-Diazo-Rules "http://example.com/path/to/rules.xml"

它们也将正常工作(假设,至少在这个例子中,您的中间件已启用read_network选项)。

部署选项

您可以使用您选择的任何服务器进行部署——它不需要是Paste。同样,您可以使用您选择的任何前端进行部署——它绝对不需要是Apache。如果您已经部署了类似上面的东西,那么请考虑在这里贡献您的部署配置!

Cherokee, uWSGI和Pip/Buildout

一个成功的部署利用了Cherokee Web服务器uWSGI,并使用Web服务器机器上的本地套接字运行uWSGI。Cherokee(类似于Ngnix)可以直接与uWSGI通信,而uWSGI又能直接利用像上面那样的Paste风格的ini配置。对于uWSGI,所需添加的唯一配置是在ini文件顶部添加以下内容

[uwsgi]
home = /opt/diazo
processes = 8
vacuum = true
master = true
socket = %(home)/var/uwsgi.sock
pythonpath = %(home)/eggs/*.egg
pythonpath = %(home)/src/*

然后是uWSGI,它只是与所有依赖项一起简单安装,因此

cd /opt/diazo
virtualenv .
source bin/activate
pip install uwsgi collective.diazo.readheaders djb.headerproxy

可以使用以下方式轻松启动

./bin/uwsgi --ini-paste diazo.ini

它从配置中读取自己的选项,包括WSGI管道和相关配置。为了加分,您还可以使用Buildout部署上述内容

[buildout]
parts = lxml instance
eggs-directory = eggs

[lxml]
recipe = z3c.recipe.staticlxml
egg = lxml

[instance]
recipe = zc.recipe.egg
eggs =
    collective.diazo.readheaders
    djb.headerproxy
    uwsgi
dependent-scripts = true

呼!

贡献

https://github.com/collective/collective.diazo.readheaders加入 – 如果您已经是集体的一员,那么您已经可以推送更改。否则,分叉并发送拉取请求。

贡献者

大卫·比蒂,作者

变更日志

0.1 (2012-08-09)

  • 使用templer创建的包 [大卫·比蒂]

项目详情


下载文件

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

源分发

支持