[英]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.