トップPython入門 > Pythonで WWWサーバーを作る

Pythonで WWWサーバーを作る

1.はじめに

OSMカスタム地図では、Pythonプログラムを介して、タイル画像を作成している。 タイル画像のオンデマンド更新では一度に作成するタイル数が10前後と小さいため、 その都度、Pythonプログラムを起動する方法ではオーバヘッドが大きい。 Pythonプログラムを常駐タスクとしておき、地図システムとの通信をプロセス間通信とする方法は既に試した。 直に、ソケット通信を使ったため、多少、通信が複雑になった。

HTTPを使う方がアプリケーションプログラムがシンプルになるかも知れない。

2.最も簡単な WWWサーバ

最も簡単には、次のようにするだけで、WWWサーバが起動される。ブラウザで "http://loclahost:2000/" とすれば、 この場合 c:\gis 下のファイルへのアクセスが提供される。

c:\gis>python -m SimpleHTTPServer 8000

3.Flask

WWWサーバを作るわけではないので、Flaskを使うのはちょっとオーバーか。 Flaskのインストールは下のように簡単。

c:\gis>pip install Flask

まず、簡単なサーバテストプログラムを書いてみる。

[hello.py]
from flask import Flask
app = Flask(__name__)

@app.route("/")
def hello():
    return "Hello World!"

if __name__ == "__main__":
    app.run()

起動するとポート番号が 5000 であることが分かる。 ブラウザでURLを "http://localhost:5000/" とすると、 Hello World! が表示された。

c:\Python27>python hello.py
 * Running on http://127.0.0.1:5000/ (Press CTRL+C to quit)

実際にはパスを送り、該当する png ファイルを返す形になる。 次の flask01.py の場合、URL を "http://localhost:5000/osm/a/b/c.png" とすると、 /osm/a/b/c.png が返される。

実際のプログラムでは、zoom, x, y の値から該当するタイル画像を作成し、この画像データを返すか、 または、決められたディレクトリ下に画像ファイルを格納する。 WWWサーバーとしては画像ファイルを返すことになるが、地図システムの場合、 決められたディレクトリ下に画像ファイルを格納する方が簡単で効率がよいであろう。

[flask01.py]
from flask import Flask
app = Flask(__name__)

@app.route('/osm/<zoom>/<x>/<y>.png')
def osm(zoom=None, x=None, y=None):
    return "/osm/" + zoom + "/" + x + "/" + y + ".png"

if __name__ == "__main__":
    app.run()
c:\Python27>python flask01.py
 * Running on http://127.0.0.1:5000/ (Press CTRL+C to quit)
127.0.0.1 - - [14/Dec/2016 16:22:56] "GET /osm/a/b/c.png HTTP/1.1" 200 -

同時接続数を設定するだけで、タイル生成がマルチスレッドで行われるならば、プログラムはシンプルで済む。 文献[3]によれば次のようにすればよいようだ。

app.run(threaded=True)

A.リファレンス

[1] SimpleHTTPServer ― 簡潔な HTTP リクエストハンドラ
[2] ウェブアプリケーションフレームワーク Flask を使ってみる
[3] Flaskにおける複数リクエストの並列処理