tkapplication_cgi.py 技術ドキュメント
ライブラリの機能や目的
tkapplication_cgi.py は、CGI (Common Gateway Interface) 環境下で動作するWebアプリケーションをPythonで開発する際に利用されるユーティリティライブラリです。既存の tkApplication クラスを継承し、CGI特有の機能(HTTPリクエスト処理、HTML出力、フォームデータ解析、基本的なセキュリティチェック)を追加することで、サーバーサイドスクリプトの作成を簡素化することを目的としています。
主な機能は以下の通りです。
HTML生成の補助: Webブラウザへ送信するHTMLの基本的な構造(DOCTYPE, head, bodyタグなど)を簡単に生成・出力できます。
CGIリクエストの判定: 現在のリクエストがGETメソッドかPOSTメソッドかを判別する機能を提供します。
フォームデータの取得: GETまたはPOSTメソッドで送信されたフォームデータやクエリ文字列パラメータを簡単に取得できます。
パスの簡易検証: ファイルパスやディレクトリパスに含まれる可能性のある不適切な文字列(例:
../,//, 特殊文字)を検出し、セキュリティ上のリスクを軽減するための簡易的な検証機能を提供します。
このライブラリを使用することで、PythonによるCGIスクリプト開発において、低レベルなHTTPヘッダーの操作やフォームデータのパースといった共通タスクから開発者を解放し、アプリケーションのビジネスロジックに集中できるようになります。
importする方法
このライブラリを他のPythonプログラムから利用するには、以下のように tkApplication_CGI クラスをインポートします。
from tkapplication_cgi import tkApplication_CGI
必要な非標準ライブラリとインストール方法
tkapplication_cgi.py は以下の非標準ライブラリに依存しています。
requests: HTTPリクエストを送信するためのライブラリですが、このライブラリのソースコード内では直接使用されていません(
import requestsはありますが、requestsオブジェクトがどこでも使われていません)。しかし、もし将来的にHTTPクライアント機能が必要になった場合のために、インストールしておくことを推奨します。 インストール方法:pip install requests
tklib: このライブラリは
tklib.tkapplication.tkApplicationクラスを継承しています。tklibは通常、カスタムライブラリまたは特定のプロジェクトに付属するライブラリである可能性が高いです。 インストール方法: 一般的なPythonパッケージと同様にpipでインストールできる場合は以下のコマンドでインストールできます。pip install tklib
もし
pipでインストールできない場合、このライブラリが利用されているプロジェクトの指示に従ってtklibを入手し、Pythonのインポートパスが通る場所に配置してください。
importできる変数と関数
tkapplication_cgi.py からimportできる主要な要素は tkApplication_CGI クラスです。このクラスは tkApplication を継承しており、CGI環境特有のメソッドを提供します。
クラス: tkApplication_CGI
tkApplication クラスを継承し、CGIアプリケーション開発のための機能を提供します。
インスタンス変数
form:cgi.FieldStorageオブジェクトを保持します。これにより、GETやPOSTで送信されたフォームデータを効率的に扱うことができます。
メソッド
__init__(self, **args)tkApplication_CGIクラスのコンストラクタです。親クラスのコンストラクタを呼び出し、CGIフォームデータを格納するためのcgi.FieldStorageオブジェクトを初期化します。引数:
**args(任意): 親クラスtkApplicationのコンストラクタに渡される任意のキーワード引数。
戻り値: なし
__del__(self)オブジェクトが破棄される際に呼び出されるデストラクタです。親クラスtkApplicationのデストラクタを呼び出します。引数: なし
戻り値: なし
__str__(self)オブジェクトの文字列表現を返します。親クラスのClassPath()メソッドの結果を返します。引数: なし
戻り値:
str- クラスのパスを示す文字列。
init_html(self, charset='utf-8', lang='ja', extra_headers=None, header_only=False)HTMLページの開始部分を出力します。HTTPヘッダーとHTMLの<head>セクション(DOCTYPE, html, head, metaタグを含む)を生成します。引数:
charset(str, 省略可能): HTMLの文字セット。デフォルトは'utf-8'。lang(str, 省略可能): HTMLの言語。デフォルトは'ja'。extra_headers(str, 省略可能):<head>セクションに追加する追加のHTMLヘッダー。header_only(bool, 省略可能):Trueの場合、<body>タグは出力せず、ヘッダー部分のみを出力します。デフォルトはFalse。
戻り値: なし (標準出力にHTMLを出力します)
end_html(self)HTMLページの終了部分を出力します。</body>および</html>タグを出力します。引数: なし
戻り値: なし (標準出力にHTMLを出力します)
get_cgi_mode(self)現在のCGIリクエストのHTTPメソッドを文字列で返します。引数: なし
戻り値:
str- リクエストメソッドがGETの場合は'get'、POSTの場合は'post'、それ以外の場合は空文字列''を返します。
get_args(self)GETリクエストのクエリ文字列 (QUERY_STRING) を解析し、キーと値のペアを辞書として返します。引数: なし
戻り値:
dict- クエリ文字列パラメータをキーと値として持つ辞書。
is_get(self)現在のCGIリクエストがGETメソッドであるかを判定します。引数: なし
戻り値:
bool- リクエストメソッドがGETの場合はTrue、それ以外の場合はFalse。
is_post(self)現在のCGIリクエストがPOSTメソッドであるかを判定します。引数: なし
戻り値:
bool- リクエストメソッドがPOSTの場合はTrue、それ以外の場合はFalse。
getvalue(self, key, defval=None)フォームデータ (self.form) から指定されたキーの値を取得します。キーが存在しない場合は、defvalを返します。引数:
key(str): 取得したいフォームデータのキー。defval(任意, 省略可能): キーが見つからなかった場合に返すデフォルト値。デフォルトはNone。
戻り値:
strまたはNoneまたはdefval- 指定されたキーの値。
getfirst(self, key, defval=None)フォームデータ (self.form) から指定されたキーの最初の値を取得します。cgi.FieldStorageのgetfirstメソッドと同様の動作です。引数:
key(str): 取得したいフォームデータのキー。defval(任意, 省略可能): キーが見つからなかった場合に返すデフォルト値。デフォルトはNone。
戻り値:
strまたはNoneまたはdefval- 指定されたキーの最初の値。
validate_path(self, path, keys='all')提供されたパス文字列に対して、セキュリティ上の問題となる可能性のあるパターン(例: トップディレクトリへのアクセス、親ディレクトリへの移動、不正な文字)が含まれていないかを検証します。引数:
path(str): 検証するパス文字列。keys(str または list of str, 省略可能): 実行する検証のタイプを指定します。'all'(デフォルト): 全ての検証を実行します。'top_dir': トップディレクトリへの不正アクセス (/,\,C:,//など) をチェックします。'upper_dir': 親ディレクトリへの移動 (..) をチェックします。'invalid_char': 不正な文字 (<,>,|) をチェックします。
戻り値:
str- 問題が検出された場合はエラーメッセージ文字列を、問題がない場合は空文字列''を返します。
main scriptとして実行したときの動作
tkapplication_cgi.py には if __name__ == "__main__": ブロックが存在しません。
したがって、このファイルを直接Pythonインタプリタで実行 (python tkapplication_cgi.py) しても、何らかの特別な処理が実行されることはありません。このライブラリは、他のCGIアプリケーションスクリプトから tkApplication_CGI クラスをインポートし、利用されることを想定して設計されています。