この記事で分かること
- HTTPサーバーが何に使われるのか分かる
- PythonプログラミングでのHTTPサーバーの立て方が分かる
PythonでHTTPサーバーを立てる概要
PythonでLinuxサーバー上に簡易HTTPサーバーを立てる方法を説明します。HTTPサーバーを立てると、HTTPメッセージ(GETやPOST)をPythonプログラムの中で受信することができます。
例えば、チャットBOTへメッセージが届いた旨を知らせるイベントなどは、「指定された場所にHTTPメッセージを送信する」という構成になっている場合が多いです。
この構成の場合、チャットルームで、ユーザーがBOTへのメッセージが送信されると、そのこともとに、HTTPメッセージがHTTPサーバーに送信されて、HTTPメッセージの受信をトリガに、別のPythonプログラムを実行するという使い方ができます。
PythonでHTTPサーバーを立てる前提の環境
PythonでHTTPサーバーを立てる前提の環境は、下の記事で説明している私の環境と同じ環境で確認しています。
レンタルサーバーなどのLinuxサーバーを使っている場合は、下の記事でプログラミングする環境の作り方を説明しています。もし、まだプログラムする環境ができていない方は、先にこちらの記事を読んで、プログラミングできる環境をつくることをおすすめします。
PythonでHTTPサーバーを立てるサンプルプログラム
HTTPサーバーを立てるサンプルプログラムの作成
サンプルプログラムの作成は次の順番で説明します。
- ライブラリのインポート
- HTTPリクエストを扱うクラスの定義の作成
- HTTPサーバを起動する関数の定義
- 定義した関数の実行
1.ライブラリのインポート
ここでは、HTTPサーバーを扱うライブラリをインポートします。
from BaseHTTPServer import BaseHTTPRequestHandler, HTTPServer
ライブラリパッケージ「BaseHTTPServer」の中から「BaseHTTPRequestHandler」と「HTTPServer」をインポートする。
2.HTTPリクエストを扱うクラスの定義の作成
ここでは、HTTPリクエストを扱うクラスを定義しています。それぞれのHTTPリクエストが来た時の処理方法をこのクラスのメソッド(関数)として定義しています。
class S(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("<html><body><h1>GET message receive!</h1></body></html>")
def do_POST(self):
self._set_headers()
self.wfile.write("<html><body><h1>POST message receive!</h1></body></html>")
- クラス「BaseHTTPRequestHandler」を継承して、クラス「S」を定義宣言する。
- 自身のクラスの関数「_set_headers」を定義宣言する。
- 関数「send_response」で応答ヘッダを送信する。
- 関数「send_header」でHTTPヘッダを書き込む。
- 関数「end_headers」でHTTPヘッダの終了を意味する空行を送信する。
- 関数「do_GET」を定義宣言する。
- 自身のクラスの関数「_set_headers」を呼び出す。
- 文字列「<html><body><h1>GET message receive!</h1></body></html>」をポストメッセージに書き出す。
- 関数「do_POST」を定義宣言する。
- 自身のクラスの関数「_set_headers」を呼び出す。
- 文字列「<html><body><h1>POST message receive!</h1></body></html>」をポストメッセージに書き出す。
3.HTTPサーバを起動する関数の定義
ここでは、サーバーの立ち上げ処理を記載しています。基本的な処理の流れは、変数「httpd」にhtttpクラスのインスタンスを取得し、そのクラスインスタンスの関数「serve_forever」をコールすれば、HTTPサーバーが立ち上がります。
また、例としてポートは「8888」を指定しています。これは各自で任意のポートを指定してください。なお、一旦、関数「httpd.serve_forever」を呼ぶとサーバー機能を常駐して提供する為、関数「run_http_server」の戻り値は戻りません。
def run_http_server(server_class=HTTPServer, handler_class=S, port=8888):
# startup HTTP server
server_address = ('', port)
httpd = server_class(server_address, handler_class)
print('HTTP server started....')
httpd.serve_forever()
- 変数「server_address」を初期化する。
- 変数「httpd」に、引数で取り入れた「server_calss」のインスタンスで初期化する。
- 文字列「HTTP server started....」を表示する。
- 変数「httpd」の関数「serve_forever」を呼び出す。
4.定義した関数の実行
ここでは上で定義した関数を呼び出す処理を作成します。上で定義したサーバーを立ち上げる関数「run_http_server」を呼び出します。
if __name__ == '__main__':
run_http_server()
関数「run_http_server」を呼び出す。