0

BaseHTTPServerを使用するPythonコースを受講しています。彼らが始めるコードはここにあります

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を使用するには、両方をインターフェースする必要があります。wsgi が BaseHTTPServer から派生している可能性があると考えたので、それらをインターフェースして、pythonanywhere.com で私のコースを使用することが可能かもしれません。

メイン関数のコードを取り除き、代わりにアプリケーション関数を使用する必要があることは明らかです。しかし、これがどのように機能するか正確にはわかりません。呼び出したコールバック (start_response) を取得し、コンテンツを取得しますか? これを webServerHandler クラスと組み合わせるにはどうすればよいですか?

これが可能であれば、理論上は Google アプリ エンジンでも機能するはずです。ここで BaseHTTPServer が使用されている非常に複雑な例を見つけましたが、これはまだ複雑すぎます。

これを行うことは可能ですか? はいの場合、誰かがこれを行う方法のヒントを教えてくれ、基本的な開始コードを提供してくれますか?

4

1 に答える 1

1

つまり、WSGI は、リクエストと Web アプリケーション間のインターフェースを定義する仕様です。すなわち。HTTP リクエストを受信すると、仕様に記載されている標準化された方法で Web アプリケーションに渡します (例: この環境変数を設定する必要がある、この引数を渡す必要がある、この呼び出しを行う必要があるなど)。

一方、BaseHTTPServerどちらもインターフェイスを定義し、実際に Web 要求を処理するコードも備えています。

  • これはSimpleHTTPServer、python2 標準ライブラリ (またはhttp.serverpython3) からほぼ独占的に実装されている、ほとんど使用されていないインターフェイスであり、サーバーは本番環境向けのものではありません。
  • これは、SimpleHTTPServer主にローカルで開発するために設計されたためです。たとえば、localhost でテストするときに、js クロスオリジン要求の問題を回避するのに役立ちます。

現在、WSGI はpython webappsの事実上の標準になっているため、python で記述されたほとんどの web サイトは、webapp-y のものから WSGI 要件を受け取り、実装する server/interface-y 機能を分離しています。

あなたのコードには、「webapp-y」と「http request / interface-yの処理」の両方を行う単一のコードがあります。これは間違いではなく、サーバーがどのように http リクエストを処理するかなどの基本的な理解を得るのに最適です。

したがって、私の提案は次のようになります。

  1. クラスがいずれかの python webapp フレームワーク (例: django、flask、.bottle、web2py、cherrypy など) をすぐに使用し始める場合は、それまで pythonanywhere を使用するのを待つことができます。
  2. クラスがサーバーの核心を掘り下げることに焦点を当てている場合は、コードから「webapp-y」レイヤーをリファクタリングして、PythonAnywhere で「webapp-y」レイヤーを使用するだけで済みます。ローカルで、「server/interface-y」を開始し、「webapp-y」をインポートして応答を生成します。これが成功した場合は、おめでとうございます。WSGI をサポートするサーバーを作成しました。
于 2015-05-20T13:19:23.327 に答える