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