🙌

Python Webアプリケーション自作入門

2020/10/31に公開1

はじめに

本記事は、Zennのオンラインブック

「伸び悩んでいる3年目Webエンジニアのための、Python Webアプリケーション自作入門」

の一部抜粋になります。

こちら
https://zenn.dev/articles/ce02960bee6b3ed5b75d/edit
も併せてお読みください。

PythonでWebサーバーを書いてみる

いきなりですが、Pythonでブラウザからリクエストを受け取り、ブラウザへレスポンスを返すサーバーを作成してみましょう。
以下のプログラムは、自分のPCのポート8080(localhost:8080)ででサーバーとして起動し、ブラウザからリクエストを受け付けるとその内容をserver_recv.txtというファイルに書き出し、その後server_send.txtというファイルの内容を読み込んでレスポンスとしてブラウザへ返却します。

TCPServer.py

import socket


class TCPServer:
    """
    TCP通信を行うサーバーを表すクラス
    """
    def serve(self):
        """
        サーバーを起動する
        """

        print("=== サーバーを起動します ===")

        try:
            # socketを生成
            server_socket = socket.socket()
            server_socket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)

            # socketをlocalhostのポート8080番に割り当てる
            server_socket.bind(("localhost", 8080))
            server_socket.listen(10)

            # 外部からの接続を待ち、接続があったらコネクションを確立する
            print("=== クライアントからの接続を待ちます ===")
            (client_socket, address) = server_socket.accept()
            print(f"=== クライアントとの接続が完了しました remote_address: {address} ===")

            # クライアントから送られてきたデータを取得する
            request = client_socket.recv(4096)

            # クライアントから送られてきたデータをファイルに書き出す
            with open("server_recv.txt", "wb") as f:
                f.write(request)

            # クライアントへ送信するレスポンスデータをファイルから取得する
            with open("server_send.txt", "rb") as f:
                response = f.read()

            # クライアントへレスポンスを送信する
            client_socket.send(response)

            # 通信を終了させる
            client_socket.close()

        finally:
            print("=== サーバーを停止します。 ===")


if __name__ == '__main__':
    server = TCPServer()
    server.serve()

返却用のserver_send.txtも作成しておきましょう。

server_send.txt

HTTP/1.1 200 OK
Date: Wed, 28 Oct 2020 07:57:45 GMT
Server: Apache/2.4.41 (Unix)
Content-Location: index.html.en
Vary: negotiate
TCN: choice
Last-Modified: Thu, 29 Aug 2019 05:05:59 GMT
ETag: "2d-5913a76187bc0"
Accept-Ranges: bytes
Content-Length: 45
Keep-Alive: timeout=5, max=100
Connection: Keep-Alive
Content-Type: text/html

<html><body><h1>It works!</h1></body></html>

プログラムを動かしてみる

コンソールでソースコードを配置したディレクトリまで移動し、下記コマンドでプログラムを実行します。

$ python TCPServer.py
=== サーバーを起動します ===
=== クライアントからの接続を待ちます ===

コンソールのタブは開いたままにして、ブラウザでhttp://localhost:8080へアクセスしてみましょう。

スクリーンショット 2020-10-26 18.49.04.png

無事にWebページとして表示されましたね!

Webサーバーの仕組みを理解する

コメント等を除けば、たった十数行で、かなり原始的なWebサーバーを動かすことができました。
(現時点ではWebサーバーと呼べるようなシロモノではなく、TCPサーバーと呼ぶのが正確ですが・・・)

何事も、仕組みを理解するには自分で作ってみるのが一番の近道です。

WebサーバーやWebフレームワークの仕組みを理解したい方は、是非オンラインブック
https://zenn.dev/bigen1925/books/e6c9492a82f5e2e10fca/viewer/504d96
を読んでみてください!

本記事のソースコードの解説もあります。

Discussion

HikaruooHikaruoo

socketモジュールを使って実際にサーバーを立ち上げ、リクエストを受け取ってレスポンスを返す流れが手に取るように分かります。Webサーバーの仕組みを理解するための第一歩として、この手法は非常に有益です