uWSGI转换
从uWSGI 1.9.7起,一个“转换”API已被添加到 uWSGI内部路由 。
一个转换就像是一个应用到由你的应用生成的响应上的过滤器。
转换可以是链式的 (一个转换的输出将会是接下来的转换的输入) ,并且可以完全覆盖响应头。
转换最常见的例子是gzip编码。你的应用的输出被传递到一个用gzip压缩它并且设置Content-Encoding头的函数中。这个特性依赖2个外部包:libpcre3-dev, Ubuntu上的libz-dev。
- [uwsgi]
- plugin = python,transformation_gzip
- http-socket = :9090
- ; load the werkzeug test app
- module = werkzeug.testapp:test_app
- ; if the client supports gzip encoding goto to the gzipper
- route-if = contains:${HTTP_ACCEPT_ENCODING};gzip goto:mygzipper
- route-run = last:
- route-label = mygzipper
- ; pass the response to the gzip transformation
- route = ^/$ gzip:
这个 cachestore
路由指令也是一个转换,因此,你可以缓存响应的各种状态。
- [uwsgi]
- plugin = python,transformation_gzip
- http-socket = :9090
- ; load the werkezeug test app
- module = werkzeug.testapp:test_app
- ; create a cache of 100 items
- cache = 100
- ; if the client support gzip encoding goto to the gzipper
- route-if = contains:${HTTP_ACCEPT_ENCODING};gzip goto:mygzipper
- route = ^/$ cache:key=werkzeug_homepage
- route = ^/$ cachestore:key=werkzeug_homepage
- route-run = last:
- route-label = mygzipper
- route = ^/$ cache:key=werkzeug_homepage.gz
- ; first cache the 'clean' response (for client not supporting gzip)
- route = ^/$ cachestore:key=werkzeug_homepage
- ; then pass the response to the gzip transformation
- route = ^/$ gzip:
- ; and cache it again in another item (gzipped)
- route = ^/$ cachestore:key=werkzeug_homepage.gz
另一个常见的转换是将样式表应用到XML文件上。 (见 XSLT插件)
toxslt
转换由xslt
插件公开:
- uwsgi --plugin xslt --http-socket :9090 -w mycd --route-run "toxslt:stylesheet=t/xslt/cd.xml.xslt,params=foobar=test&agent=\${HTTP_USER_AGENT}"
这里的 mycd
模块是一个简单的XML生成器。它的输出稍后被传递给XSLT转换。
流与缓冲
每个转换宣告自己是一个“流”,还是一个“缓冲”。
流是可以应用到响应块(部分)的转换。一个流转换的例子是gzip (要开始压缩它,你无需完整的body)。缓冲转换是那些在应用某些操作之前需要完整的body的转换。XSLT就是一个缓冲转换的例子。另一个缓冲转换的例子是那些用于将响应存储在某些缓存中的操作。
如果你整个管道是只由“流”转换组成的,那么你的客户端将会按块接收输出。另一方面,单个缓冲转换会让整个管道缓冲,因此,你的客户端只会在最后获得输出。
常用的流功能是gzip + chunked:
- [uwsgi]
- plugins = transformation_gzip,transformation_chunked
- route-run = gzip:
- route-run = chunked:
- ...
整个转换管道是由流插件组成的,英寸你将会实时获得每个HTTP块。
flush魔法
“flush”转换是特别的。它让你发送当前转换缓冲内容到客户端 (无需清理缓冲)。
你可以用它在应用缓冲的时候实现流模式。常用的例子是流+缓存:
- [uwsgi]
- plugins = transformation_toupper,transform_tofile
- ; convert each char to uppercase
- route-run = toupper:
- ; after each chunk converted to upper case, flush to the client
- route-run = flush:
- ; buffer the whole response in memory for finally storing it in a file
- route-run = tofile:filename=/tmp/mycache
- ...
你可以多次以及在链的不同部分调用flush。试验一下吧…
可用转换 (最新更新 20130504)
gzip
, 由transformation_gzip
插件公开 (编码响应缓冲到gzip)toupper
, 由transformation_toupper
插件公开 (样例插件转换每个字符为大写)tofile
, 由transformation_tofile
插件公开 (用来将响应缓冲缓存到一个静态文件中)toxslt
, 由xslt
插件公开 (应用xslt样式表到一个XML响应缓冲)cachestore
, 由router_cache
插件公开 (缓存响应缓冲到uWSGI缓存中)chunked
, 以HTTP chunked编码输出flush
, 刷新当前缓冲到客户端memcachedstore
, 将响应缓冲存储到一个memcached对象上redisstore
, 将响应缓冲存储到一个redis对象上template
, 应用路由转换到每个块上
正在进行中
rpc
, 允许应用rpc函数到一个响应缓冲 (限制64k大小)lua
, 应用一个lua函数到一个响应缓冲 (无大小限制)