元セブ島在住のエンジニアの僕「Tommy」が、プログラミング・英語・セブ事情を発信するブログ

Tommy's blog

【Python】HTTPサーバーを立てる【→業務改善したい人向け】

11月 22, 2019

プログラム学生
HTTPのGETをメッセージを受信するために、HTTPサーバーを立てたんですが...
簡易的なHTTPサーバーであれば、Pythonで立てることができるよ。<br>今回はその方法を説明するね。
Tommy

この記事で分かること

  • 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サーバーを立てるサンプルプログラムの作成

サンプルプログラムの作成は次の順番で説明します。

  1. ライブラリのインポート
  2. HTTPリクエストを扱うクラスの定義の作成
  3. HTTPサーバを起動する関数の定義
  4. 定義した関数の実行

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>")

  1. クラス「BaseHTTPRequestHandler」を継承して、クラス「S」を定義宣言する。
  2. 自身のクラスの関数「_set_headers」を定義宣言する。
  3. 関数「send_response」で応答ヘッダを送信する。
  4. 関数「send_header」でHTTPヘッダを書き込む。
  5. 関数「end_headers」でHTTPヘッダの終了を意味する空行を送信する。
  6. 関数「do_GET」を定義宣言する。
  7. 自身のクラスの関数「_set_headers」を呼び出す。
  8. 文字列「<html><body><h1>GET message receive!</h1></body></html>」をポストメッセージに書き出す。
  9. 関数「do_POST」を定義宣言する。
  10. 自身のクラスの関数「_set_headers」を呼び出す。
  11. 文字列「<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()

  1. 変数「server_address」を初期化する。
  2. 変数「httpd」に、引数で取り入れた「server_calss」のインスタンスで初期化する。
  3. 文字列「HTTP server started....」を表示する。
  4. 変数「httpd」の関数「serve_forever」を呼び出す。

4.定義した関数の実行

ここでは上で定義した関数を呼び出す処理を作成します。上で定義したサーバーを立ち上げる関数「run_http_server」を呼び出します。

if __name__ == '__main__':

	run_http_server()

関数「run_http_server」を呼び出す。