0

我在使用BaseHTTPServer的Python課程。他們下手的代碼是here在Python中將BaseHttpServer連接到WSGI

from BaseHTTPServer import BaseHTTPRequestHandler, HTTPServer 

class webServerHandler(BaseHTTPRequestHandler): 
    def do_GET(self): 
     try: 
      if self.path.endswith("/hello"): 
       self.send_response(200) 
       self.send_header('Content-type', 'text/html') 
       self.end_headers() 
       message = "" 
       message += "<html><body>Hello!</body></html>" 
       self.wfile.write(message) 
       print message 
       return 
     except IOError: 
      self.send_error(404, 'File Not Found: %s' % self.path) 

def main(): 
    try: 
     port = 8080 
     server = HTTPServer(('', port), webServerHandler) 
     print "Web Server running on port %s" % port 
     server.serve_forever() 
    except KeyboardInterrupt: 
     print " ^C entered, stopping web server...." 
     server.socket.close() 

if __name__ == '__main__': 
    main() 

我使用Python的任何地方,那裏唯一可能獲得的應用程序在互聯網上是使用WSGI接口。

的WSGI接口的配置文件看起來是這樣的:

import sys 

path = '<path to app>' 
if path not in sys.path: 
    sys.path.append(path) 

from app import application 

應用程序可以是這樣的:

def application(environ, start_response): 
    if environ.get('PATH_INFO') == '/': 
     status = '200 OK' 
     content = HELLO_WORLD 
    else: 
     status = '404 NOT FOUND' 
     content = 'Page not found.' 
    response_headers = [('Content-Type', 'text/html'), ('Content-Length', str(len(content)))] 
    start_response(status, response_headers) 
    yield content.encode('utf8') 

參考hello world將與HTML內容的字符串。

我不能像在例子中那樣指向端口8080。爲了在任何地方使用python,我必須同時接口。我估計它可能有可能是從BaseHTTPServer派生的wsgi,所以它可能可以連接它們並在pythonanywhere.com上使用我的課程。

很明顯,我必須擺脫主代碼中的代碼,改用應用程序功能。但我並不完全明白這是如何工作的。我收到一個回調(start_response),我打電話,然後我產生內容?我怎樣才能將它與webServerHandler類結合起來?

如果這將是可能的,它應該在理論上也適用於谷歌應用程序引擎。我發現了一個非常複雜的示例here,其中使用了BaseHTTPServer,但這對我來說太複雜了。

是否有可能做到這一點,如果是的話可以有人給我一個提示如何做到這一點,併爲我提供一些基本的開始代碼?

+1

如果你能評論爲什麼downvote,那麼我會改善這個問題。 –

+0

我在查看你的問題,當你編輯它,我認爲你改善了你的問題(我沒有投票你順便說一句)。另外一個建議是包含您收到的任何錯誤消息。 –

回答

1

因此WSGI是一個specification,它定義了請求和webapp之間的接口。即。當它接收到一個http請求時,它會按照規範中描述的標準方式將它傳遞給webapp(例如:它必須設置這個環境變量,它必須通過這個參數,它必須進行這個調用等)。

另一方面,BaseHTTPServer都定義了一個接口,並且還具有實際提供Web請求的代碼。

  • 這是一個很少使用的接口由SimpleHTTPServer從python2標準庫(或http.server在python3)實現幾乎完全和服務器不能用於任何生產就緒。
  • 這是因爲SimpleHTTPServer主要是爲本地開發而設計的。例如,它可以幫助您在testing on localhost時通過js跨源請求問題。

如今,WSGI有become the de facto standard爲蟒蛇的webapps,所以大多數用Python編寫的網站上分離出接收並實現從Web應用程序-Y的東西WSGI要求服務器/接口-Y功能。

在你的代碼中,你有一段代碼既執行「webapp-y」,也執行「處理http請求/接口-y」的東西。這沒有錯,對於理解服務器如何處理http請求等非常有用。

所以我的建議是:

  1. 如果你的類將開始使用任何的Python web應用框架很快anywahs(例如:Django的,瓶,瓶,web2py中,CherryPy的等等),那麼你可以可能只是等到使用pythonanywhere。
  2. 如果您的課程專注於深入研究服務器的基本特性,您可以從代碼中重構出「webapp-y」圖層,並使用PythonAnywhere上的「webapp-y」圖層。在本地,您將啓動「server/interface-y」,然後導入您的「webapp-y」以生成響應。如果你成功地做到了這一點,那麼恭喜!你有(只)寫了一個server that supports WSGI
+0

謝謝,我會等到班上要用燒瓶,我知道在pyhonanywhere工作得很好。我發現了一個晚上的臨時修復,那就是使用雲9平臺,我只需要直接訪問端口8080並獲得代碼工作。我會接受你的回答。 –