簡體   English   中英

如何將CGI轉換為WSGI?

[英]How do I Convert CGI to WSGI?

我繼承了使用CGI腳本的代碼庫。 據我了解,它們效率低下,因為每次請求進入時它們都會派生一個新流程。我目前正在嘗試將它們轉換為WSGI,但是我對以下內容感到困惑:

  1. WSGI和CGI在代碼方面有何不同? 我知道該應用程序必須是可調用的,但除此之外,我不確定要更改它還需要做什么。

  2. 如何以我的基准衡量我所讀到的效率變化與變化有關?

其他可能有用的信息是我將使用Apache和mod_wsgi。

讓我知道是否還有其他我可以提供的信息。

wsgi在某些方面將cgi所做的某些事情抽象為純python函數調用,而沒有副作用。

cgi程序的“輸入”是進程環境,位於os.environsys.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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM