「大人の教養・知識・気付き」を伸ばすブログ

一流の大人(ビジネスマン、政治家、リーダー…)として知っておきたい、教養・社会動向を意外なところから取り上げ学ぶことで“気付く力”を伸ばすブログです。データ分析・語学に力点を置いています。 →現在、コンサルタントの雛になるべく、少しずつ勉強中です(※2024年1月21日改訂)。

MENU

Pythonをゆっくりていねいに学ぶ(その23/X)

 Pythonを真面目にゆっくり学ぶべく

を参考に学んでいきます*1

9. ウェブを解きほぐす

 英国の科学者\mathrm{Tim} \mathrm{Berners}-\mathrm{Lee}が、\mathrm{CERN}と研究コミュニティの中で情報拡散を助けるための提案がワールド・ワイド・ウェブ(www)であり、それは以下の3つのアイディアに集約された:

  • \mathrm{HTTP}
  • \mathrm{HTML}
  • \mathrm{URL}

こうして開発されたインターネットは爆発的に普及し、そのための技術開発には様々なコンピュータ言語が使われてきた。その中でも\mathrm{Python}はあらゆるレベルのウェブ関連の開発で優れている。

9.1 ウェブクライアント

 インターネットの低水準プロトコル\mathrm{TCP}/\mathrm{IP}である。これはコンピュータ間でバイトデータをやり取りする。このときそれらがどのような意味なのかは考慮しない。
 ウェブはクライアント・サーバーシステムである。クライアントはサーバーに要求(リクエス)を送る。\mathrm{TCP}/\mathrm{IP}接続を解説し、\mathrm{HTTP}を介して\mathrm{URL}その他の情報を送り、応答(レスポンス)を受け取る。応答の形式も\mathrm{HTTP}で定義されている。
 もっともよく知られたウェブクライアントはウェブブラウザである。ブラウザは様々な方法で\mathrm{HTTP}要求を送ることができる。

 \mathrm{HTTP}にはステートレス(\mathrm{stateless})という側面があり、個々の\mathrm{HTTP}接続は他の接続に依存せず独立している。これによりウェブ操作が単純化される面もあれば複雑化している面もある。

  • キャッシング

     変化しないリモートコンテンツは、サーバーから同じものをダウンロードすることを避けるために、ウェブクライアントで保存して活用する。
  • セッション

     ショッピングサイトは、ショッピングカートの内容を覚えておかなければならない。
  • 認証

     ユーザー名とパスワードを必要とするサイトは、ユーザーがログインしている間、それを覚えておかなければならない。

 ステートレスな\mathrm{HTTP}に代わり状態を管理する方法としてクッキーがある。サーバーがクライアント固有情報をクッキーに収めてクライアントに送る。クライアントがサーバーにクッキーを送り返すと、サーバーはクライアント固有情報からクライアントを一意に識別することができる。

9.1.1 Pythonの標準ウェブライブラリ

 \mathrm{Python\ 3}の目標の1つはウェブクライアントとサーバーモジュールをまとめることであった。

\mathrm{http} クライアントサーバー\mathrm{HTTP}の詳細を管理する
  \mathrm{client}は、クライアントサイドの処理を行う。
  \mathrm{server}\mathrm{Python}によるウェブサーバー開発を助ける。
\mathrm{cookies}\mathrm{cookiejar}は複数のサイトアクセスにまたがって必要な情報を保存するクッキーを管理する。
\mathrm{urllib} \mathrm{http}の上で実行される。
  \mathrm{request}はクライアントの要求を処理する。
  \mathrm{response}はサーバーの応答を処理する。
  \mathrm{}\mathrm{URL}を部品に切り分ける。

以下はアクセス例である。

import urllib.request as ur

url = 'https://raw.githubusercontent.com/koki0702/introducing-python/master/dummy_api/fortune_cookie_random1.txt'
conn = ur.urlopen(url)
print(conn)

# ウェブページからのデータを受け取る
data = conn.read()
print('Webページから受け取ったデータ:',data)

# HTTPステータスコード
print('HTTPステータスコード:', conn.status)

# データ形式
print('データ形式:',conn.getheader('Content-Type'))

for key,value in conn.getheaders():
    print(key, value)

応答の中でも特に重要なのは\mathrm{HTTP}ステータスコード(上の例では\mathrm{conn}.\mathrm{status}で取得。)である。ステータスコードには以下がある:

  • \mathrm{1xx}(情報)

     サーバーは要求を受け取ったが、クライアントに対して知らせるべき追加情報がある。
  • \mathrm{2xx}(成功)

     要求は正しく機能した。ただし\mathrm{200}以外の成功コードには、追加情報が含まれている。
  • \mathrm{3xx}(リダイレクト)

     リソースが移動しているので、応答はクライアントに対して新しい\mathrm{URL}を返す。
  • \mathrm{4xx}(クライアントエラー)

     クライアントサイドに問題がある。
  • \mathrm{5xx}(サーバーエラー)

     ウェブサーバーに問題がある。

9.2 ウェブサーバー

 ウェブフレームワークは、ウェブサイトを作るための機能を提供する。

9.2.1 Pythonによるもっとも単純なウェブサーバー

 コマンドプロンプトにて以下を打ち込めば\mathrm{HTTP}サーバーが実行され、問題が無ければ初期ステータスメッセージが表示される。
 カレントディレクトリからの相対パスでファイルを要求すれば、ファイルが返される。たとえばウェブブラウザでhttp://localhost:8000と入力すればカレントディレクトリのファイル一覧が表示されるはずである。

python -m http.server
9.2.2 WSGI

 クライアントがウェブサーバーに外部プログラムを実行させ、その結果を受け取れるようにすべく\mathrm{CGI}が作られた。\mathrm{CGI}はクライアントから送られてきた入力引数を受け取り、サーバーを介して外部プログラムに渡すこともできた。しかし、それらのプログラムは個々のクライアント・アクセスごとに新たに起動されていた。
 小さなプログラムでも、起動にはかなりの時間がかかるのを防ぐべく、言語インタープリタがウェブサーバーに組み込まれるようになった。
 \mathrm{Python}ウェブ開発は、\mathrm{Python}ウェブアプリケーションおよびウェブサーバー間の普遍的な\mathrm{API}である\mathrm{WSGI}が定義されてから飛躍的に前進した。

9.2.3 フレームワーク

 \mathrm{HTTP}\mathrm{WSGI}の細部はウェブサーバーが処理するが、実際にサイトのための\mathrm{Python}コードを書くにはウェブフレームワークを使う。
 \mathrm{Python}でウェブサイトを書きたければ\mathrm{Python}ウェブフレームワークを使えばよい。

  • ルーティング

     \mathrm{URL}を解釈し、対応するサーバーファイルかサーバーの\mathrm{Python}コードを見つける。
  • テンプレート

     サーバーサイドのデータを\mathrm{HTML}ページに流し込む。
  • 認証と権限付与

     ユーザー名、パスワード、パーミッションを処理する。
  • セッション

     ユーザーがウェブサイトに来ている間、一時的なデータストレージを維持管理する。

*1:第2版が出ているものの初版しか持っていないのでこちらで。

プライバシーポリシー お問い合わせ