[英]How do I Convert CGI to WSGI?
我继承了使用CGI脚本的代码库。 据我了解,它们效率低下,因为每次请求进入时它们都会派生一个新流程。我目前正在尝试将它们转换为WSGI,但是我对以下内容感到困惑:
WSGI和CGI在代码方面有何不同? 我知道该应用程序必须是可调用的,但除此之外,我不确定要更改它还需要做什么。
如何以我的基准衡量我所读到的效率变化与变化有关?
其他可能有用的信息是我将使用Apache和mod_wsgi。
让我知道是否还有其他我可以提供的信息。
wsgi在某些方面将cgi所做的某些事情抽象为纯python函数调用,而没有副作用。
cgi程序的“输入”是进程环境,位于os.environ
和sys.stdin
。 此类程序的输出为sys.stdout
,错误从sys.stderr
到达服务器日志。
wsgi应用程序是一个带两个*参数的python函数,通常称为environ
(将是dict
)和start_response
(将是另一个函数)。
第一个参数是dict
,包含cgi程序将在os.environ
获得的所有内容,但它还包含几个额外的键。 值得注意的是,它包含"wsgi.input"
,这是一个类似文件的对象,出于请求正文的目的,它代替sys.stdin
。
一个cgi程序将sys.stdout
用于HTTP响应行,响应标头和响应正文。 在wsgi程序中,前两个作为参数传递给start_response
参数。 wsgi响应正文未**写入文件; 相反,它是从app函数返回的。
一个典型的CGI程序可能如下所示:
import os, sys
request_size = int(os.environ.get("HTTP_CONTENT_LENGTH", "0"))
person = sys.stdin.read(request_size)
response = "Hello %s!\n" % person
print "Status: 200 OK"
print "Content-Type: text/plain"
print "Content-Length: %d" % len(response)
print
print response
等效的wsgi程序如下所示:
def myApp(environ, start_response):
request_size = int(environ.get("HTTP_CONTENT_LENGTH", "0"))
wsgi_input = environ.get("wsgi.input")
person = wsgi_input.read(request_size) if request_size and wsgi_input else ""
response = "Hello %s!\n" % person
start_response("200 OK",
[("Content-Type", "text/plain"),
("Content-Length", str(len(response)))]
return [response]
*由于技术原因,有一个可选的第三个参数,主要用于“中间件”
**为了与旧的Web框架兼容,start_response()返回可以写入的类似文件的对象,但是不建议这样做。 在您的情况下,这可能会简化转换,但是由于仍然需要进行侵入式更改,因此请查看是否可以避免。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.