PythonでWebサーバーを起動する簡単な方法

プログラミング

PythonでWebサーバーを起動する簡単な方法

Pythonは、そのシンプルさと強力なライブラリ群により、Webサーバーを簡単に起動するための優れた選択肢となります。ちょっとしたファイル共有や、ローカルでのWebアプリケーション開発、APIのテストなど、様々な用途で手軽にWebサーバーを立ち上げることができます。ここでは、Python標準ライブラリに含まれる機能や、外部ライブラリを活用したWebサーバーの起動方法を、具体的なコード例と共に解説します。

Python標準ライブラリによるWebサーバー起動

Pythonには、追加のインストールなしで利用できるHTTPサーバー機能が標準で搭載されています。これにより、特定のディレクトリ内のファイルをブラウザからアクセス可能にする、最も簡単な方法を提供します。

http.serverモジュール

Python 3からは、http.serverモジュールが導入され、より洗練されたHTTPサーバー機能を提供します。このモジュールは、SimpleHTTPRequestHandlerというクラスを含んでおり、これを利用することで、カレントディレクトリをルートとする静的なWebサーバーを起動できます。

コマンドラインからの起動方法

最も手軽な方法は、ターミナルやコマンドプロンプトから直接コマンドを実行することです。

python -m http.server [ポート番号]

例えば、ポート8000でサーバーを起動したい場合は、以下のコマンドを実行します。

python -m http.server 8000

もしポート番号を指定しない場合、デフォルトでポート8000が使用されます。このコマンドを実行すると、ターミナルに以下のようなメッセージが表示され、サーバーが起動したことを示します。

Serving HTTP on 0.0.0.0 port 8000 (http://0.0.0.0:8000/) ...

この状態で、Webブラウザを開き、アドレスバーにhttp://localhost:8000またはhttp://127.0.0.1:8000と入力すると、コマンドを実行したディレクトリ内のファイル一覧が表示され、それらのファイルにアクセスできるようになります。

Pythonスクリプトからの起動方法

PythonスクリプトとしてWebサーバーを起動することも可能です。これにより、起動時の設定や、サーバー起動後の処理をより細かく制御できます。

import http.server
import socketserver

PORT = 8000
Handler = http.server.SimpleHTTPRequestHandler

with socketserver.TCPServer(("", PORT), Handler) as httpd:
    print(f"Serving at port {PORT}")
    httpd.serve_forever()

このコードをserver.pyのようなファイル名で保存し、実行します。

python server.py

上記コマンドラインからの起動と同様に、ポート8000でWebサーバーが起動します。この方法は、ファイル共有だけでなく、後述するWebアプリケーションフレームワークと組み合わせて利用する際の基盤としても利用できます。

動的なWebアプリケーションのためのWebサーバー

標準ライブラリのhttp.serverは主に静的なファイルを提供するためのものです。動的なコンテンツ(例えば、データベースから取得した情報を表示したり、ユーザーの入力に応じて処理を行ったりするWebアプリケーション)を開発・実行するには、より高機能なWebフレームワークと、それに対応したWebサーバーが必要になります。

WSGIサーバー

PythonのWebアプリケーションは、Web Server Gateway Interface (WSGI) という標準インターフェースを通じてWebサーバーと連携します。WSGIサーバーは、Webフレームワークからのリクエストを受け取り、アプリケーションに渡し、アプリケーションからのレスポンスをWebサーバーに返します。

Gunicorn

Gunicorn(Green Unicorn)は、Python WSGI HTTPサーバーとして広く利用されているプロダクショングレードのアプリケーションサーバーです。軽量で、設定も比較的簡単でありながら、高いパフォーマンスと安定性を提供します。

Gunicornをインストールするには、pipを使用します。

pip install gunicorn

Gunicornは、WSGIアプリケーション(通常はWebフレームワークで作成されたアプリケーション)を起動するために使用されます。例えば、Flaskで作成した簡単なアプリケーションapp.pyがあるとします。

# app.py
from flask import Flask

app = Flask(__name__)

@app.route("/")
def hello_world():
    return "

Hello, World!

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

このFlaskアプリケーションをGunicornで実行するには、同じディレクトリで以下のコマンドを実行します。

gunicorn app:app -w 4 -b 0.0.0.0:8000
  • app:app: 最初のappはPythonファイル名(app.py)、2番目のappはFlaskアプリケーションインスタンスの名前です。
  • -w 4: 4つのワーカープロセスを起動します。これにより、同時に複数のリクエストを処理できるようになり、パフォーマンスが向上します。
  • -b 0.0.0.0:8000: サーバーのバインドアドレスとポートを指定します。ここでは、全てのネットワークインターフェース(0.0.0.0)のポート8000でリッスンします。

Gunicornは、開発環境でのflask runよりも堅牢なサーバーとして機能し、本番環境でのアプリケーションデプロイにも適しています。

uvicorn

uvicornは、ASGI (Asynchronous Server Gateway Interface) に準拠した、超高速なASGIサーバーです。ASGIはWSGIの非同期版であり、FastAPIのような非同期フレームワークと組み合わせて使用されます。

uvicornをインストールします。

pip install uvicorn

FastAPIで作成した簡単なアプリケーションmain.pyの例です。

# main.py
from fastapi import FastAPI

app = FastAPI()

@app.get("/")
def read_root():
    return {"Hello": "World"}

このFastAPIアプリケーションをuvicornで実行するには、以下のコマンドを実行します。

uvicorn main:app --reload --port 8000
  • main:app: main.pyファイル内のappというFastAPIインスタンスを指定します。
  • --reload: コードの変更を検知し、サーバーを自動的に再起動します。開発時には非常に便利です。
  • --port 8000: ポート8000でサーバーを起動します。

uvicornは、非同期処理を活用することで、高いパフォーマンスを実現します。現代的なPython Web開発では、FastAPIやStarletteといったASGIフレームワークとの組み合わせでよく利用されます。

まとめ

PythonでWebサーバーを起動する方法は、その目的に応じて複数存在します。

  • python -m http.server: 最も手軽で、カレントディレクトリの静的ファイルを共有したい場合に最適です。追加のインストールは不要です。
  • http.serverモジュールをスクリプトで利用: Pythonコード内でサーバーの起動を制御したい場合に便利です。
  • Gunicorn: FlaskやDjangoなどのWSGIフレームワークで開発したWebアプリケーションを、より堅牢に、そして本番環境に近い形で実行するためのWSGIサーバーです。
  • uvicorn: FastAPIやStarletteなどのASGIフレームワークで開発した、非同期処理を活用したWebアプリケーションを実行するための高速なASGIサーバーです。

これらの方法を理解することで、Pythonを使ったWeb開発の様々なシーンで、最適なWebサーバーを迅速に立ち上げることができます。簡単なファイル共有から、本格的なWebアプリケーションのデプロイまで、PythonのWebサーバー機能は非常に強力で柔軟です。