Python
 Computer >> コンピューター >  >> プログラミング >> Python

Python CGIスクリプトですべてのHTTPヘッダーを読み取る方法

ApacheのCGIスクリプト(Python)でも、カスタムHTTPリクエストヘッダーの値を簡単に取得できます。仕組みはシンプルで、Apacheのmod_cgiが受信した各HTTPリクエストヘッダーを環境変数として設定してくれる点にあります。

HTTPヘッダーが環境変数になる仕組み

mod_cgi経由で実行されるスクリプトでは、受け取ったすべてのHTTPリクエストヘッダーに対して、HTTP_というプレフィックス(接頭辞)が付いた環境変数が自動的に生成されます。

たとえば、次のようなカスタムヘッダーを送信した場合:

x-client-version: 1.2.3

この値は、環境変数 HTTP_X_CLIENT_VERSION として参照できるようになります。ヘッダー名は大文字に変換され、ハイフン(-)はアンダースコア(_)に置き換えられる点に注意してください。

特定のヘッダー値を取得する方法

上記のカスタムヘッダーを読み取るには、Pythonのos.environを使って次のように記述します。

import os
client_version = os.environ["HTTP_X_CLIENT_VERSION"]

すべてのHTTP_*ヘッダーを一覧表示するサンプルスクリプト

以下のスクリプトを実行すると、HTTP_で始まるすべての環境変数(=すべてのHTTPリクエストヘッダー)とその値が出力されます。

#!/usr/bin/env python

import os
print "Content-Type: text/html"
print "Cache-Control: no-cache"
print

print "<html><body>"
for headername, headervalue in os.environ.iteritems():
    if headername.startswith("HTTP_"):
        print "<p>{0} = {1}</p>".format(headername, headervalue)

print "</body></html>"

Python 3で実行する場合の注意点

上記のコードはPython 2向けの書き方です。Python 3ではiteritems()メソッドが廃止されているため、代わりにitems()を使用してください。

#!/usr/bin/env python3

import os
print("Content-Type: text/html")
print("Cache-Control: no-cache")
print()

print("<html><body>")
for headername, headervalue in os.environ.items():
    if headername.startswith("HTTP_"):
        print("<p>{0} = {1}</p>".format(headername, headervalue))

print("</body></html>")

まとめ

  • Apacheのmod_cgiは、受信したHTTPリクエストヘッダーをHTTP_プレフィックス付きの環境変数として渡す。
  • 個別のヘッダーはos.environ["HTTP_ヘッダー名"]で取得できる。
  • os.environをループしてHTTP_で始まるキーを抽出すれば、すべてのヘッダーを一覧表示できる。
  • Python 3ではitems()を使うことに注意。
  1. Pythonでパターンを出力する方法|三角形・数字・アルファベット・ピラミッドのコード例

    Pythonでパターンを出力するには、ネストされた(入れ子構造の)forループを使用します。外側のループで行数を制御し、内側のループで列数を処理します。そしてprint文を工夫することで、目的に応じたさまざまなパターンを作成できます。パターンには、星(アスタリスク)パターン、数字パターン、アルファベットパターンなどがあり、三角形やピラミッドなど、さまざまな形状にも対応できます。パターン出力の基本これらのパターンは、print文を少し変更しながらforループを組み合わせることで出力できます。基本的な考え方はどのパターンも共通しており、違いはごくわずかです。ここからは、代表的なパターンのコードを実

  2. Pythonで辞書(dict)のすべてのキーを取得・表示する方法

    Pythonでは、辞書(dict)オブジェクトが持つ keys() メソッドを使うことで、すべてのキーを簡単に取得できます。このメソッドは辞書内の全キーを含むビューオブジェクト(dict_keys)を返します。 keys() メソッドでキーを取得する まずは基本的な使い方を見てみましょう。次の例では、3つのキーと値を持つ辞書から、すべてのキーを取り出しています。 >>> D1 = {1:a, 2:b, 3:c} >>> D1.keys() dict_keys([1, 2, 3]) >>> list(D1.keys()) [1, 2, 3]