中间件,允许根据传入的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配置中,细心的读者会注意到以下内容
我们使用collective.diazo.readheaders而不是diazo——这允许从传入的WSGI环境中读取X-Diazo-Rules头部并将其用作传统的rules选项。这意味着如果设置为这个头部,任何rules选项接受的格式(例如基于网络的URL)都将有效。在特定情况下,对于网络URL,您需要配置read_network启用。
本节自动接受任何选项并添加Diazo的功能:请参阅http://docs.diazo.org/en/latest/deployment.html#wsgi——我们上面已经展示了这一点。
我们使用特殊的WSGI代理djb.headerproxy,该代理将基于传入的头部反向代理到任意位置。相比之下,标准的Paste代理需要在配置中显式定义地址。根据djb.headerproxy的文档,上游的头部默认情况下期望是X-Proxy-Force-Host和X-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创建的包 [大卫·比蒂]
项目详情
collective.diazo.readheaders-0.1.zip的哈希值
算法 | 哈希摘要 | |
---|---|---|
SHA256 | 2950c133e509ef43e28253a208633a4df9b3dd5a6de07938697c7bed941ac171 |
|
MD5 | 603178e12a5ebd81aa1c0c330e8360de |
|
BLAKE2b-256 | ea216fa06803a0a73b6ec4da6e79639deb25ec0b3efd9e9616d08fe8b4686b5b |