Pythonを真面目にゆっくり学ぶべく
を参考に学んでいきます*1。
前回
9. ウェブを解きほぐす
英国の科学者 -が、と研究コミュニティの中で情報拡散を助けるための提案がワールド・ワイド・ウェブ(www)であり、それは以下の3つのアイディアに集約された:
こうして開発されたインターネットは爆発的に普及し、そのための技術開発には様々なコンピュータ言語が使われてきた。その中でもはあらゆるレベルのウェブ関連の開発で優れている。
9.1 ウェブクライアント
インターネットの低水準プロトコルは/である。これはコンピュータ間でバイトデータをやり取りする。このときそれらがどのような意味なのかは考慮しない。
ウェブはクライアント・サーバーシステムである。クライアントはサーバーに要求(リクエスト)を送る。/接続を解説し、を介してその他の情報を送り、応答(レスポンス)を受け取る。応答の形式もで定義されている。
もっともよく知られたウェブクライアントはウェブブラウザである。ブラウザは様々な方法で要求を送ることができる。
にはステートレス()という側面があり、個々の接続は他の接続に依存せず独立している。これによりウェブ操作が単純化される面もあれば複雑化している面もある。
- キャッシング 変化しないリモートコンテンツは、サーバーから同じものをダウンロードすることを避けるために、ウェブクライアントで保存して活用する。
- セッション ショッピングサイトは、ショッピングカートの内容を覚えておかなければならない。
- 認証 ユーザー名とパスワードを必要とするサイトは、ユーザーがログインしている間、それを覚えておかなければならない。
ステートレスなに代わり状態を管理する方法としてクッキーがある。サーバーがクライアント固有情報をクッキーに収めてクライアントに送る。クライアントがサーバーにクッキーを送り返すと、サーバーはクライアント固有情報からクライアントを一意に識別することができる。
9.1.1 Pythonの標準ウェブライブラリ
の目標の1つはウェブクライアントとサーバーモジュールをまとめることであった。
クライアントサーバーの詳細を管理する | |
---|---|
は、クライアントサイドの処理を行う。 | |
はによるウェブサーバー開発を助ける。 | |
とは複数のサイトアクセスにまたがって必要な情報を保存するクッキーを管理する。 | |
の上で実行される。 | |
はクライアントの要求を処理する。 | |
はサーバーの応答を処理する。 | |
はを部品に切り分ける。 |
以下はアクセス例である。
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)
応答の中でも特に重要なのはステータスコード(上の例では.で取得。)である。ステータスコードには以下がある:
- (情報) サーバーは要求を受け取ったが、クライアントに対して知らせるべき追加情報がある。
- (成功) 要求は正しく機能した。ただし以外の成功コードには、追加情報が含まれている。
- (リダイレクト) リソースが移動しているので、応答はクライアントに対して新しいを返す。
- (クライアントエラー) クライアントサイドに問題がある。
- (サーバーエラー) ウェブサーバーに問題がある。
9.2 ウェブサーバー
ウェブフレームワークは、ウェブサイトを作るための機能を提供する。
9.2.1 Pythonによるもっとも単純なウェブサーバー
コマンドプロンプトにて以下を打ち込めばサーバーが実行され、問題が無ければ初期ステータスメッセージが表示される。
カレントディレクトリからの相対パスでファイルを要求すれば、ファイルが返される。たとえばウェブブラウザでhttp://localhost:8000と入力すればカレントディレクトリのファイル一覧が表示されるはずである。
python -m http.server
9.2.2 WSGI
クライアントがウェブサーバーに外部プログラムを実行させ、その結果を受け取れるようにすべくが作られた。はクライアントから送られてきた入力引数を受け取り、サーバーを介して外部プログラムに渡すこともできた。しかし、それらのプログラムは個々のクライアント・アクセスごとに新たに起動されていた。
小さなプログラムでも、起動にはかなりの時間がかかるのを防ぐべく、言語インタープリタがウェブサーバーに組み込まれるようになった。
ウェブ開発は、ウェブアプリケーションおよびウェブサーバー間の普遍的なであるが定義されてから飛躍的に前進した。
*1:第2版が出ているものの初版しか持っていないのでこちらで。