使用x-accel-redirect发送文件的wsgi中间件
xsendfile_middleware的Python项目详细描述
支持x-accel-redirect的wsgi中间件
说明
Nginx有一种机制,通过返回X-Accel-Redirect头, 一个web应用可能会说服nginx直接为静态文件提供服务。 PEP 333定义了应用服务器(或中间件)的机制 可以通过提供^{tt1}直接提供文件$ 在environ中。 这个包提供了一个wsgi中间件来利用这些 两种机制。
尽管包的名称是什么,但目前这个中间件只起作用 使用nginx的X-Accel-Redirect机制。(可能是 简单地概括它使其工作X-Sendfile,但是 现在,我不需要了。)
使用量
中间件是xsendfile_middleware.xsendfile_middleware。 您可以直接调用它,例如:
from xsendfile_middleware import xsendfile_middleware def main(**settings): """ Construct and return a filtered app. """ def my_app(environ, start_response): # ... return app_iter # wrap middleware around app return xsendfile_middleware(my_app)
还提供了一个合适的入口点,以便您可以实例化 来自PasteDeploy.ini文件的中间件,例如:
[app:myapp] use = egg:MyEgg [pipeline:main] pipeline = egg:xsendfile_middleware myapp
配置
x_重定向映射
一旦你有了中间件,唯一需要的配置 (或可能)是在wsgi环境中设置一个X_REDIRECT_MAP键。 你怎么做取决于你是怎么安排的。如果你是 例如,在uwsgi下运行应用程序,然后可以使用 如nginxconfig中的以下内容:
location /app { uwsgi_pass 127.0.0.1:6543; include uwsgi_params; uwsgi_param X_REDIRECT_MAP /path/to/files/=/_redir_/; } location /_redir_/ { internal; alias /path/to/files/; }
在此配置中,如果您的应用程序返回 中间件提供的文件包装器的实例,以及 包装器将文件包装在e.g., /path/to/files/dir/file.data, 中间件将设置X-Accel-Redirect: /_redir_/dir/file.data 响应中的头。(希望这会导致nginx发送 直接发送给客户所需的文件。)
X_REDIRECT_MAP的格式是以逗号分隔的 “/prefix/=/base_uri/”映射。作为捷径,“/prefix/” (不带等号)与“/prefix/=/prefix/”的意思相同。 X-Accel-Redirect包含原始文件名的头将是 发送匹配路径。)将签入映射中的条目 顺序;第一个匹配的条目获胜。如果没有匹配的条目, 然后,中间件将在链的上游不受干扰地传递响应。
警告: X_REDIRECT_MAP的解析相当简单。事情会的 如果你试着用逗号,等号, 或前缀或base_uri中的任何非ascii字符。 另外,不要在X_REDIRECT_MAP中包含任何多余的空白。
更改
0.1.1(2016-10-28)
>(版本0.1不存在。它的pkg-info中有损坏的rst 使pypi上的自述文件不被格式化。)从0.1a3开始无任何更改(测试配置除外)。这个包裹 已经在生产中使用了很多年了-还是放弃 “阿尔法”名称。
测试
- 放弃对Python3.2的支持。现在在Python2.6,2.7下测试,
3.3、3.4、3.5、pypy和pypy3。
0.1a3(2015-05-08)
棕色的袋子。上一版本不可用,请执行以下操作:
- 确保传递给的头中不包含Unicode字符串 start_response。
0.1a2(2015-05-08)
- py3k,pypy兼容性:测试现在在python 2.6,2.7下运行, 3.2、3.3、3.4、pypy和pypy3。
0.1a1(2013-12-11)
初始版本