サーチ…


シンプルなHTTPサーバーの実行

Python 2.x 2.3
python -m SimpleHTTPServer 9000
Python 3.x 3.0
python -m http.server 9000

このコマンドを実行すると、現在のディレクトリのファイルがポート9000で使用されます。

ポート番号として引数が指定されていない場合、サーバーはデフォルトポート8000実行されます。

-mフラグはsys.pathを検索し、対応する.pyファイルがモジュールとして実行されるようにします。

あなたがlocalhost上でのみ提供したいなら、以下のようなカスタムPythonプログラムを書く必要があります:

import sys
import BaseHTTPServer
from SimpleHTTPServer import SimpleHTTPRequestHandler

HandlerClass = SimpleHTTPRequestHandler
ServerClass  = BaseHTTPServer.HTTPServer
Protocol     = "HTTP/1.0"

if sys.argv[1:]:
   port = int(sys.argv[1])
else:
   port = 8000
server_address = ('127.0.0.1', port)

HandlerClass.protocol_version = Protocol
httpd = ServerClass(server_address, HandlerClass)

sa = httpd.socket.getsockname()
print "Serving HTTP on", sa[0], "port", sa[1], "..."
httpd.serve_forever()

ファイルの提供

次のファイルのディレクトリがあるとします。

ここに画像の説明を入力

次のようにこれらのファイルを提供するようにWebサーバーを設定できます。

Python 2.x 2.3
import SimpleHTTPServer
import SocketServer

PORT = 8000

handler = SimpleHTTPServer.SimpleHTTPRequestHandler
httpd = SocketServer.TCPServer(("localhost", PORT), handler)
print "Serving files at port {}".format(PORT)
httpd.serve_forever()
Python 3.x 3.0
import http.server
import socketserver

PORT = 8000

handler = http.server.SimpleHTTPRequestHandler
httpd = socketserver.TCPServer(("", PORT), handler)
print("serving at port", PORT)
httpd.serve_forever()

SocketServerモジュールは、ネットワークサーバーをセットアップするためのクラスと機能を提供します。

SocketServerTCPServerクラスは、TCPプロトコルを使用してサーバーを設定します。コンストラクタはサーバのアドレス(すなわちIPアドレスとポート)とサーバ要求を処理するクラスを表すタプルを受け取ります。

SimpleHTTPServerモジュールのSimpleHTTPRequestHandlerクラスを使用すると、現在のディレクトリのファイルを処理できます。

スクリプトを同じディレクトリに保存して実行します。

HTTPサーバーを実行します。

Python 2.x 2.3

python -m SimpleHTTPServer 8000

Python 3.x 3.0

python -m http.server 8000

'-m'フラグは 'sys.path'を検索し、対応する '.py'ファイルがモジュールとして実行されるようにします。

ブラウザーでlocalhost:8000を開くと、次のようになります。

ここに画像の説明を入力

SimpleHTTPServerのプログラミングAPI

python -m SimpleHTTPServer 9000を実行するとどうなりますか?

この質問に答えるために、SimpleHTTPServer( https://hg.python.org/cpython/file/2.7/Lib/SimpleHTTPServer.py)とBaseHTTPServer( https://hg.python.org/cpython/file )の構成を理解する必要があります。 /2.7/Lib/BaseHTTPServer.py)

最初に、Pythonは9000を引数としてSimpleHTTPServerモジュールを呼び出します。 SimpleHTTPServerコードを見て、

def test(HandlerClass = SimpleHTTPRequestHandler,
         ServerClass = BaseHTTPServer.HTTPServer):
    BaseHTTPServer.test(HandlerClass, ServerClass)


if __name__ == '__main__':
    test()

テスト機能は、要求ハンドラとServerClassの後に呼び出されます。今すぐBaseHTTPServer.testが呼び出されました

def test(HandlerClass = BaseHTTPRequestHandler,
         ServerClass = HTTPServer, protocol="HTTP/1.0"):
"""Test the HTTP request handler class.

This runs an HTTP server on port 8000 (or the first command line
argument).

"""

if sys.argv[1:]:
    port = int(sys.argv[1])
else:
    port = 8000
server_address = ('', port)

HandlerClass.protocol_version = protocol
httpd = ServerClass(server_address, HandlerClass)

sa = httpd.socket.getsockname()
print "Serving HTTP on", sa[0], "port", sa[1], "..."
httpd.serve_forever()

したがってここでは、ユーザーが引数として渡したポート番号が解析され、ホストアドレスにバインドされます。指定されたポートとプロトコルによるソケットプログラミングのさらに基本的なステップが実行されます。最後にソケットサーバーが起動します。

これは、SocketServerクラスから他のクラスへの継承の基本的な概要です。

    +------------+
    | BaseServer |
    +------------+
          |
          v
    +-----------+        +------------------+
    | TCPServer |------->| UnixStreamServer |
    +-----------+        +------------------+
          |
          v
    +-----------+        +--------------------+
    | UDPServer |------->| UnixDatagramServer |
    +-----------+        +--------------------+

リンクhttps://hg.python.org/cpython/file/2.7/Lib/BaseHTTPServer.pyhttps://hg.python.org/cpython/file/2.7/Lib/SocketServer.pyは、さらに検索するのに便利です情報。

BaseHTTPRequestHandlerを使用したGET、POST、PUTの基本的な処理

# from BaseHTTPServer import BaseHTTPRequestHandler, HTTPServer # python2
from http.server import BaseHTTPRequestHandler, HTTPServer # python3
class HandleRequests(BaseHTTPRequestHandler):
    def _set_headers(self):
        self.send_response(200)
        self.send_header('Content-type', 'text/html')
        self.end_headers()

    def do_GET(self):
        self._set_headers()
        self.wfile.write("received get request")
        
    def do_POST(self):
        '''Reads post request body'''
        self._set_headers()
        content_len = int(self.headers.getheader('content-length', 0))
        post_body = self.rfile.read(content_len)
        self.wfile.write("received post request:<br>{}".format(post_body))

    def do_PUT(self):
        self.do_POST()

host = ''
port = 80
HTTPServer((host, port), HandleRequests).serve_forever()

curlを使用した出力例:

$ curl http://localhost/
received get request%                                                                                                                                                                                       

$ curl -X POST http://localhost/
received post request:<br>%                                                                                                                                                                                 

$ curl -X PUT http://localhost/
received post request:<br>%                                                                                                                                                                                 

$ echo 'hello world' | curl --data-binary @- http://localhost/
received post request:<br>hello world


Modified text is an extract of the original Stack Overflow Documentation
ライセンスを受けた CC BY-SA 3.0
所属していない Stack Overflow