Help us understand the problem. What is going on with this article?

HTTPを理解するためのPython

More than 1 year has passed since last update.

概要

前回までの記事で、HTTP通信の中身についてわかりやすく(恐らく)解説しました。

今回からは私がHTTPを理解するためにPythonを使って作成したプログラムを解説しながら、
必要なPythonについての知識ともう少しHTTPについて解説していきます。

タイトル通り、HTTPを理解するためのPythonとして解説していきますが、
クラスの考え方など一般的に使えるものについても解説していきます。

GET・POST用自作プログラム

何はともあれ、私がHTTPを理解する上で作成した自作プログラムを以下に掲載します。

pyhttpd.py
#!/bin/python2.7
# -*- coding: utf-8 -*-

import BaseHTTPServer

# クラス定義--------------------

# HTTPリクエストのハンドラークラスを定義
class MyRequestHandler(BaseHTTPServer.BaseHTTPRequestHandler):

    # POST用メソッド定義
    def do_POST(self):
        #インスタンス定義
        client_address = self.client_address
        server = self.server
        path = self.path
        request_version = self.request_version
        server_version = self.server_version
        sys_version = self.sys_version

        content_len = int(self.headers.get('content-length'))
        requestbody = self.rfile.read(content_len).decode('utf-8')
        print(content_len)
        print('requestbody=' + requestbody)
        #print('client_address = ' + client_address[0] + ' ' + str(client_address[1]))
        #print('server = ' + server.server_name + ' ' + str(server.server_port))
        #print('path = ' + path)
        #print('request_version = ' + request_version)
        #print('server_version = ' + server_version)
        #print('sys_version = ' + sys_version)
        self.send_response(200)
        self.end_headers()

    # GET用メソッド定義
    def do_GET(self):
        self.send_response(200)
        self.end_headers()

        f = open("index.html", 'r')
        self.wfile.write(f.read())
        f.close()


# メイン処理--------------------

# サーバーインスタンスを作成、実行
server = BaseHTTPServer.HTTPServer(('192.168.1.80',50080),MyRequestHandler)
server.serve_forever()

このプログラムが行う処理は簡単です。

・GETリクエストを受け付けた際に、ステータスコード200とindex.htmlをレスポンスとして返す。
・POSTリクエストを受け付けた際に、ステータスコード200とpost.htmlをレスポンスとして返す。

以上です。
実際に動かしていみたい方はプログラムをコピペするとすぐに使えます。
ブラウザでアクセスする際は、URLの欄にhttp://192.168.1.80:50080と入力するとindex.htmlのページが表示されるはずです。
※index.htmlがpyhttpd.pyと同じディレクトリに存在することが前提です。

実際プログラムに何が書いてある??

掲載したプログラムはGETとPOSTのリクエストに対してレスポンスを返すという簡単なものですが、
実際にプログラムを見ても何が書いてあるのかはpythonを使う人でなければわかりにくいと思います。

他の言語を使っている方であれば見ただけでどんなことが書いてあるのかなんとなくわかるかもしれません。

このプログラムを理解するためには、

・クラス
・メソッド
・インスタンス
・モジュール

について理解する必要があります。
これらはいずれもPythonの基礎知識となるので、特にこれからPythonを勉強する人は覚えておいて損はありません。
ここから上記の4つについて簡単に説明し、pyhttpd.pyについて詳しく解説していきます。

Python基礎知識

クラス

クラスとは、よく言われますがプログラムの設計図です。
とはいえこれだけではわかりにくいと思うので、車を例に使いながら説明します。

車を作る際にももちろん設計図がありますよね(最近ではロボットで自動的に組み立てられているものもあるかもしれませんが・・・)。
設計図がなければ車は作れません。車だけではなく、飛行機やビル、電化製品なども全て設計図を元に作られています。

そして、車の設計図の中にはライトを付ける機能、ブレーキ機能、カーナビ機能など様々な機能があると思います。
この様々な機能を含んだ設計図を元に組み立てていくと、必要な機能を備えた車が出来上がるわけです。

設計図の中にブレーキ機能が書かれていなければ、その設計図を元に作った車にはブレーキ機能がありません。
なんと恐ろしい車でしょうか・・・--;)

それはさておき、Pythonのクラスもこの車の設計図と同じく必要な機能を定義したプログラムの設計図ということです。
あとで説明しますが、この必要な機能のことをメソッドと呼びます。

クラスは設計図全体のことを指している、と覚えておくとわかりやすいかもしれません。

メソッド

次にメソッドですが、既に説明しているように設計図を元に作ったものにつけたい機能のことをメソッドと呼びます。
車の例の場合、ライトをつける機能もメソッド、ブレーキ機能もメソッドです。

このメソッドは設計図(クラス)を元に実際にものを作らなければ使うことはできません。

インスタンス

多くの書籍などで実体と説明されているものがインスタンスです。

車の例で言えば、設計図を元に作り上げた「車そのもの」を指します。
設計図があるだけでは、車は動くことはできませんよね。
設計図を元に実際に作ることで設計図に書かれた機能を持った車が出来上がるわけです。

プログラムも同じで、クラスを定義してあるだけでは意味がありません。
クラスをもとに作りたい「もの」そのものを作ってあげる必要があります。

これがインスタンスです。
クラスを元にインスタンスを作ることで、クラスの中に定義していたメソッド(機能)を使えるようになります。

モジュール

モジュールは様々な用途に合わせたクラス(設計図)の塊のようなものです。
もちろんモジュールもPythonで書かれており、他のプログラムで使うこともできます。

今回の自作プログラムでも

import BaseHTTPServer

という一文が最初の方にあると思いますが、このBaseHTTPServerもモジュールです。
このBaseHTTPServerというモジュールを使うことで、HTTPに関する機能を使うことができています。
今回私が作成したpyhttpd.pyも違うプログラムの中でインポートすると、モジュールであるということになります。

次回予告

いかがでしたでしょうか。
今回は私が使った自作プログラムと、今回のプログラムを理解するのに必要なPythonの基礎知識について解説しました。
次回は実際にプログラムの中身を詳しく見ていきます。

syuji-yoshiyoshi
とある会社のインフラエンジニア。 興味を持ったことには幅広く勉強中。 パイソニスタになるべく絶賛勉強中。 使っているOSは主にCentOSとRHEL。
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
No comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
ユーザーは見つかりませんでした