允许WSGI应用程序在uWSGI下使用Transfer-Encoding: chunked。
项目描述
uwsgi-chunked
WSGI应用程序包装器,用于处理Transfer-Encoding: chunked
此库为使用 uwsgi底层api 读取使用Transfer-Encoding: chunked的请求的WSGI应用程序提供了一个简单的包装器。
在正常操作中,它将整个请求读取到内存中,因此如果您预计请求很大(如上传),您应将这些请求卸载到代理服务器(如nginx)或如果您的应用程序允许,使用流模式。
安装
$ pip install uwsgi_chunked
用法
当您运行uwsgi时,传递参数: --http-chunked-input。
与Django一起使用的方法如下,您应该编辑默认Django应用程序中提供的wsgi.py文件。
"""
WSGI config for myapp project.
It exposes the WSGI callable as a module-level variable named ``application``.
For more information on this file, see
https://docs.django.ac.cn/en/3.2/howto/deployment/wsgi/
"""
import os
from django.core.wsgi import get_wsgi_application
from uwsgi_chunked import Chunked
os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'myapp.settings')
application = Chunked(get_wsgi_application())
要使用流模式,将可选关键字参数stream=True传递给Chunked。请注意,流模式不会设置WSGI规范所要求的Content-Length头。
application = Chunked(get_wsgi_application(), stream=True)
工作原理
《Chunked》对象查找带有《Transfer-Encoding: chunked》的请求,并使用低级uwsgi API读取请求数据。然后,它将请求数据放置在`environ['wsgi.input']`中的`BytesIO`实例中,这是预期的位置。它还设置了《Content-Length》标题,因为WSGI需要这样做。在不使用流模式时,整个请求数据被读入内存,以便计算《Content-Length》标题。
开发
欢迎提出问题和PR。这是一个没有依赖的简单模块,但它只能在运行在《uwsgi》下时工作。在《uwsgi》下运行时,有一个特殊的模块可用,提供必要的API。
您可以使用`make run`在docker中运行演示应用程序。演示应用程序使用自动重新加载来检测Python模块的更改。
测试需要演示应用程序(在《uwsgi》下运行)正常工作。因此,在一个终端中执行`make run`,在另一个终端中执行`make test`。
您还可以使用`make curl`目标(演示应用程序正在运行时)使用curl进行测试。
项目详情
下载文件
下载适合您平台的文件。如果您不确定要选择哪个,请了解有关安装包的更多信息。