tkCGIApplication.py Technical Documentation
ライブラリの機能や目的
tkCGIApplication.py は、PythonでCommon Gateway Interface (CGI) アプリケーションを構築するためのフレームワークを提供するライブラリです。CGIアプリケーションの開発を簡素化し、リクエストのルーティング、HTMLやJSON形式でのレスポンス生成、エラーハンドリング、セキュリティ機能、ロギング、アカウント認証、メール送信などの一般的なWebアプリケーション機能を統合します。
主な目的は以下の通りです。
CGIアプリケーションの簡素化: CGIの低レベルな詳細を抽象化し、より高レベルなAPIを提供することで、開発者がビジネスロジックに集中できるようにします。
リクエスト処理: GET、POST、PATH_INFO、コマンドライン引数など、さまざまな方法で渡されるパラメータを統一的に取得・解析します。
ルーティング: 特定のアクションやURLパスに基づいて、適切なPython関数を実行するメカニズムを提供します。
柔軟なレスポンス: HTMLページだけでなく、JSON形式のデータも容易に出力でき、Ajaxリクエストなどに対応します。
セキュリティ: X-Frame-OptionsやContent-Security-Policy (CSP) などのHTTPヘッダーを設定し、一般的なWeb攻撃からの保護を支援します。
ロギングとエラーハンドリング: アプリケーションの動作を記録し、予期せぬエラーが発生した際に詳細なトレースバックをHTML形式で表示するなどの機能を提供します。
テンプレートエンジン統合: Jinja2テンプレートエンジンを内蔵し、動的なHTMLコンテンツ生成を容易にします。
外部サービス連携: 外部HTTPリクエスト(GET/POST/PUT/DELETE)の送信や、SMTPを使用したメール送信機能を提供します。
アカウント認証: ユーザー名、パスワード、IPアドレスに基づいた基本的なアカウント認証機能を提供し、アクセス制御を可能にします。
importする方法
このライブラリをPythonプログラムで利用するには、以下のように tkCGIApplication クラスをインポートします。
from tkCGIApplication import tkCGIApplication
# アプリケーションのインスタンスを作成
app = tkCGIApplication(__name__)
必要な非標準ライブラリとインストール方法
tkCGIApplication.py は、以下の非標準ライブラリに依存しています。これらは pip を使用してインストールできます。
python-dotenv:.envファイルから環境変数をロードするために使用されます。pip install python-dotenv
Jinja2: HTMLテンプレートをレンダリングするために使用されるテンプレートエンジンです。pip install Jinja2
requests: HTTPリクエスト(GET, POSTなど)を外部サービスに送信するために使用されます。pip install requests
PyYAML: YAML形式のファイルを解析するために使用されます。pip install PyYAML
また、以下のカスタムライブラリにも依存していますが、これらは別途入手またはプロジェクト内に配置する必要があります。
tkBase(例:from tkBase import *)tkFormData(例:import tkFormData)tkHTMLDocument(例:from tkHTMLDocument import tkHTMLElement)
これらのカスタムライブラリが適切に配置されていない場合、ModuleNotFoundError が発生します。
importできる変数と関数
このライブラリから直接インポートできる主要な関数とクラス、およびそれらの説明です。
グローバル関数
handle_exception(exc_type, exc_value, exc_tb)動作: Pythonの例外フックとして設定される関数で、捕捉されなかった例外が発生した際に呼び出されます。例外の詳細をHTML形式で整形し、標準出力(Webブラウザなど)にエラーページとして表示します。
引数:
exc_type(type): 例外の型。exc_value(Exception): 例外インスタンス。exc_tb(traceback): トレースバックオブジェクト。
戻り値: なし
クラス
tkResponse
リクエスト処理の結果を表現するためのシンプルなクラスです。真偽値として評価可能であり、成功/失敗の状態 (res) とメッセージ (message) を保持します。
__init__(self, res=False, message="")動作:
tkResponseオブジェクトを初期化します。引数:
res(bool, optional): 処理が成功したか失敗したかを示す真偽値。デフォルトはFalse。message(str, optional): 処理結果に関する詳細メッセージ。デフォルトは空文字列。
戻り値: なし
__bool__(self)動作: オブジェクトの真偽値評価を、内部の
res属性に基づいて行います。引数: なし
戻り値:
self.resの値 (bool)。
tkCGIApplication
CGIアプリケーションの主要なロジックをカプセル化するクラスです。
クラス変数
print_original: Pythonの組み込みprint関数を退避するためのクラス変数です。print関数がカスタムの出力関数にリダイレクトされた後も、オリジナルのprint関数を呼び出すために使用されます。
インスタンス変数(主なもの)
print:builtins.printのエイリアス、またはredirect_printによってリダイレクトされたカスタム出力関数。root_path: アプリケーションのルートディレクトリの絶対パス。os_name: 実行環境のOS名 (例: 'Windows', 'Linux')。script_fullpath: 実行中のスクリプトの絶対パス。script_dir: 実行中のスクリプトが存在するディレクトリの絶対パス。script_filename: 実行中のスクリプトのファイル名。static_url_path: 静的ファイルにアクセスするためのURLパス (例: '/static')。static_folder: 静的ファイルが保存されているディレクトリの絶対パス。templates_dir: テンプレートファイルが保存されているディレクトリの絶対パス。server_name: サーバー名。環境変数SERVER_NAMEから取得、または 'localhost'。script_name: 実行中のCGIスクリプト名。環境変数SCRIPT_NAMEから取得。query_string: リクエストのクエリ文字列。full_url: 現在のリクエストの完全なURL。query: リクエストから解析されたパラメータの辞書。method: HTTPリクエストメソッド (例: 'GET', 'POST')。output_target: レスポンスの出力形式 ('html' または 'json')。html_initialized: HTMLヘッダーが既に出力されたかを示すフラグ。deny_iframe: X-Frame-Options ヘッダーを設定してiframe埋め込みを禁止するかどうか。security_policy: Content-Security-Policy (CSP) ヘッダーの値。routes: URLパスとそれに対応するハンドラ関数をマッピングする辞書。error_handlers: HTTPエラーコードとそれに対応するハンドラ関数をマッピングする辞書。config_path: 設定ファイルのパス。key_info_path: 機密情報ファイルのパス。account_path: アカウント情報ファイルのパス。key_info: 機密情報が格納された辞書。mail_params: メール送信に必要なパラメータが格納された辞書。log_path: ロギングファイルのパス。security_level: セキュリティレベル (0-5) で、deny_iframeやsecurity_policyに影響します。
メソッド
__init__(self, import_name, static_folder='static', static_url_path='/static', template_folder='templates', error_handler=True)動作: アプリケーションインスタンスを初期化します。CGI関連の環境変数から情報を取得し、パスを設定します。必要に応じてデフォルトのエラーハンドラを設定します。
引数:
import_name(str): アプリケーションモジュールの名前。__name__を渡すことが一般的。static_folder(str, optional): 静的ファイルが置かれるディレクトリ名。デフォルトは 'static'。static_url_path(str, optional): 静的ファイルにアクセスするためのURLパス。デフォルトは '/static'。template_folder(str, optional): テンプレートファイルが置かれるディレクトリ名。デフォルトは 'templates'。error_handler(bool, optional): デフォルトの例外ハンドラを登録するかどうか。デフォルトはTrue。
戻り値: なし
configure(self, config_path=None, log_path=None, key_info_path=None, data_folder=None, account_path=None, config={}, security_level=5)動作: アプリケーションの設定を行います。設定ファイル、ログファイル、機密情報ファイル、データフォルダ、アカウント情報ファイルのパスを指定し、ロギングやセキュリティレベルを設定します。
引数:
config_path(str, optional): アプリケーション設定ファイルのパス。log_path(str, optional): ロギングファイルのパス。key_info_path(str, optional): 機密情報(例: メールサーバー認証情報)ファイルのパス。data_folder(str, optional): データ保存用フォルダのパス。account_path(str, optional): アカウント情報ファイルのパス。config(dict, optional): 追加の設定を辞書形式で直接指定。security_level(int, optional): アプリケーションのセキュリティレベル (0-5)。デフォルトは 5。
戻り値: なし
setup_config(self, security_level=5)動作: 指定されたセキュリティレベルに基づいて、X-Frame-OptionsとContent-Security-Policyヘッダーを設定します。
引数:
security_level(int, optional): セキュリティレベル。デフォルトは 5。
戻り値: なし
init_html(self, target="html", charset="utf-8", title="title", html_ver="HTML5", force_init=False)動作: CGIレスポンスのHTTPヘッダーとHTMLの開始タグを出力します。
targetが "json" の場合はJSONヘッダーを出力します。引数:
target(str, optional): 出力形式 ("html" または "json")。デフォルトは "html"。charset(str, optional): 文字コード。デフォルトは "utf-8"。title(str, optional): HTMLページのタイトル。デフォルトは "title"。html_ver(str, optional): HTMLバージョン。デフォルトは "HTML5"。force_init(bool, optional): 既に初期化されていても強制的に再初期化するかどうか。デフォルトはFalse。
戻り値: なし
end_html(self)動作: HTMLの終了タグ
</body></html>を出力します。init_htmlが呼び出され、かつ出力ターゲットが "json" でない場合にのみ機能します。引数: なし
戻り値: なし
set_error_handler(self)動作: システムの例外フック (
sys.excepthook) をhandle_exception関数に設定します。これにより、未捕捉の例外がHTML形式で表示されます。引数: なし
戻り値: なし
set_mail_params(self, info={})動作: メール送信に必要なパラメータを内部辞書
self.mail_paramsに設定します。info辞書で提供された値をマージします。引数:
info(dict, optional): メールパラメータを含む辞書。デフォルトは空辞書。
戻り値: なし
start_logging(self, log_path)動作: 指定されたパスにロギングを設定し、アプリケーションのイベントを記録できるようにします。ログディレクトリが存在しない場合は作成します。
引数:
log_path(str): ロギングファイルの絶対パス。
戻り値: なし
setup_logging(self)動作: ロギングモジュールを初期設定します。指定された
log_pathにログファイルを作成し、DEBUGレベル以上のメッセージを記録します。引数: なし
戻り値: なし
load_config(self, config_path)動作: 指定されたINI形式の設定ファイルを読み込み、辞書として返します。ファイルが存在しないか、形式が不正な場合はエラーメッセージを出力し、
Noneを返します。tkBase.read_iniを利用します。引数:
config_path(str): 設定ファイルのパス。
戻り値: 設定内容を含む辞書、または
None。
load_key_info(self, key_info_path)動作: 指定されたINI形式の機密情報ファイルを読み込み、辞書として返します。ファイルが存在しない場合はエラーメッセージを出力し、
Noneを返します。tkBase.read_iniを利用します。引数:
key_info_path(str): 機密情報ファイルのパス。
戻り値: 機密情報を含む辞書、または
None。
read_config(self, path)動作: 設定ファイルを読み込みます。パスが指定されない場合は、スクリプトのディレクトリとファイル名からデフォルトのパスを生成します (
{dirname}/{filebody}.cfg)。引数:
path(str, optional): 設定ファイルのパス。デフォルトはNone。
戻り値: 設定内容を含む辞書。
例外: ファイル読み込みに失敗した場合
RuntimeErrorを発生させます。
replace_path(self, path=None, template=None, ext_dict={})動作: 指定されたパスとテンプレート文字列を使用して新しいパスを生成します。テンプレートには
{dirname},{filebody},{ext}などのプレースホルダを使用できます。tkBase.replace_pathを利用します。引数:
path(str, optional): 元となるパス。デフォルトはself.script_fullpath。template(str or list, optional): 新しいパスのテンプレート。リストの場合、要素はos.path.joinで結合されます。デフォルトは{dirname}/{filebody}-out.txt。ext_dict(dict, optional): 追加のプレースホルダ辞書。
戻り値: 生成されたパス文字列。
get_method(self)動作: HTTPリクエストメソッド ('GET', 'POST' など) を環境変数
REQUEST_METHODから取得します。引数: なし
戻り値: リクエストメソッド (str)。
get_path_info(self)動作: 環境変数
PATH_INFOからパス情報 (/path/to/resource) を取得します。引数: なし
戻り値: パス情報 (str)。
get_path_args(self)動作: 環境変数
PATH_INFOからパス情報を取得し、スラッシュで区切られた引数のリストとして返します。引数: なし
戻り値: パス引数のリスト (list of str)。
get_client_inf(self)動作: クライアントのIPアドレス、ポート、ユーザーエージェント、ホスト名などの情報を環境変数から取得し、辞書として返します。
引数: なし
戻り値: クライアント情報を含む辞書 (dict)。
reload(self)動作: ブラウザにJavaScriptコードを出力し、現在のページをリロードさせます。
引数: なし
戻り値: なし
redirect(self, new_url)動作: ブラウザにJavaScriptコードを出力し、指定されたURLにリダイレクトさせます。
引数:
new_url(str): リダイレクト先のURL。
戻り値: なし
download(self, file_path)動作: 指定されたファイルをダウンロードとしてブラウザに送信します。ファイルが存在しない場合は404エラーを返します。
引数:
file_path(str): ダウンロードするファイルのパス。
戻り値: なし
textarea_copy(self, text, textarea_id="textarea_id", rows=5, cols=100, copy_button_text='copy')動作: 指定されたテキストを含むHTMLの
textareaと、その内容をクリップボードにコピーするためのボタンを出力します。引数:
text(str):textareaに表示するテキスト。textarea_id(str, optional):textarea要素のID。デフォルトは "textarea_id"。rows(int, optional):textareaの行数。デフォルトは 5。cols(int, optional):textareaの列数。デフォルトは 100。copy_button_text(str, optional): コピーボタンのテキスト。デフォルトは 'copy'。
戻り値: なし
error(self, *args)動作: エラーメッセージを赤色のフォントでHTMLに出力します。
引数:
*args: 出力するメッセージの可変長引数。
戻り値: なし
write(self, *args)動作: 引数を標準出力に書き出します。引数が文字列の場合はそのまま出力し、
tkHTMLElementのインスタンスやouterHTML属性を持つオブジェクトの場合はそのouterHTMLを出力します。必要であればHTMLヘッダーを初期化します。引数:
*args: 出力する文字列またはtkHTMLElementオブジェクトの可変長引数。
戻り値: なし
print_custom(self, *args, **kwargs)動作:
builtins.print関数をラップし、必要に応じてHTMLヘッダーを初期化した上で標準出力に内容を書き出します。引数:
*args,**kwargs:builtins.printと同じ引数。
戻り値: なし
redirect_print(self, print_func=None)動作: Pythonの組み込み
print関数をカスタム関数にリダイレクトします。print_funcが指定されればその関数に、指定されなければself.print_customにリダイレクトします。引数:
print_func(callable, optional):printの代わりに使用する関数。デフォルトはNone。
戻り値: なし
route(self, action)動作: ルーティングを定義するためのデコレータです。指定された
actionに対応するURLパスがリクエストされた際に、デコレートされた関数が実行されるように登録します。引数:
action(str): ルートとして登録するURLパスまたはアクション名。
戻り値: デコレータ関数。
使用例:
@app.route('/hello') def hello_world(): return "Hello, World!"
register_error_handler(self, code, handler)動作: 指定されたHTTPエラーコード (
code) に対して、カスタムのエラーハンドラ関数 (handler) を登録します。引数:
code(int): HTTPエラーコード (例: 404)。handler(callable): エラーが発生した際に呼び出される関数。
戻り値: なし
handle_error(self, code)動作: 登録されたエラーハンドラが存在する場合、指定されたエラーコードに対応するハンドラを呼び出します。存在しない場合はデフォルトのJSONエラー応答を出力します。
引数:
code(int): 発生したHTTPエラーコード。
戻り値: エラーハンドラの戻り値、または
None。
get_account_list(self)動作:
self.account_pathで指定されたYAMLファイルからアカウント情報リストを読み込みます。ファイルが存在しないか解析に失敗した場合はNoneを返します。引数: なし
戻り値: アカウント情報の辞書リスト、または
None。
get_account(self, user, account_list)動作: アカウントリストから指定された
userに一致するアカウント情報を検索し、その辞書を返します。引数:
user(str): 検索するユーザー名。account_list(list of dict): アカウント情報のリスト。
戻り値: マッチしたアカウント情報辞書、または
None。
is_valid_root_dir(self, rootDir)動作: ルートディレクトリパスに
'../'や'./'といった相対パスの危険なシーケンスが含まれていないかをチェックします。引数:
rootDir(str): 検査するルートディレクトリパス。
戻り値: 安全であれば
True、そうでなければFalse。
is_valid_filemask(self, filemask)動作: ファイルマスクの妥当性をチェックしますが、現在の実装では常に
Trueを返します。引数:
filemask(str): 検査するファイルマスク。
戻り値: 常に
True。
is_allowed_path(self, path, allowed_dirs, file_masks=[], rejected_file_masks=[])動作: 指定されたパスが、許可されたディレクトリ、ファイルマスクのルールに合致し、かつ拒否されたファイルマスクのルールに抵触しないかをチェックします。
引数:
path(str): 検査するパス。allowed_dirs(list of str): 許可されたディレクトリのリスト。file_masks(list of str, optional): 許可するファイル名の正規表現マスクのリスト。rejected_file_masks(list of str, optional): 拒否するファイル名の正規表現マスクのリスト。
戻り値:
tkResponseオブジェクト。許可されていればTrue、そうでなければFalseと理由のメッセージ。
is_valid_ip(self, account, ip)動作: 指定されたIPアドレスが、アカウント情報に登録されている許可IPアドレスのパターンに一致するかをチェックします。
引数:
account(dict): アカウント情報を含む辞書。ip(str): 検査するIPアドレス。
戻り値: 有効であれば
True、そうでなければFalse。
is_valid_password(self, account, password)動作: 指定されたパスワードが、アカウント情報に登録されているパスワードと一致するかをチェックします。
引数:
account(dict): アカウント情報を含む辞書。password(str): 検査するパスワード。
戻り値: 有効であれば
True、そうでなければFalse。
validate_account(self, func)動作: アカウント認証を行うためのデコレータです。デコレートされた関数が呼び出される前に、リクエストのクエリパラメータからユーザー名とパスワードを取得し、IPアドレスとともにアカウント情報を検証します。認証に失敗した場合は、JSON形式のエラーメッセージを出力し、メール通知を行うことがあります。
引数:
func(callable): 認証後に実行する関数。
戻り値: デコレータ関数。
使用例:
@app.route('/protected_data') @app.validate_account def get_protected_data(): return json.dumps({"data": "secret_info"})
logging(self, func)動作: 関数呼び出しの前後にログメッセージを記録するためのデコレータです。関数の入出を追跡するのに便利です。
引数:
func(callable): ログを記録する関数。
戻り値: デコレータ関数。
使用例:
@app.logging def my_function(): # ... 処理 ... return "Result"
send_mail(self, server_info, params=None, message='no message')動作: 指定されたSMTPサーバー情報とパラメータを使用してメールを送信します。Jinja2テンプレートを使用してメール本文を生成します。
引数:
server_info(dict): SMTPサーバー情報(smtp_server,port,username,password)。params(dict, optional): メール送信パラメータ(from,to,subject,template_pathなど)。message(str, optional): メール本文に追加するメッセージ。
戻り値: メール送信が成功した場合は
True、失敗した場合はFalse。
email(self, inf, server_info)動作: デコレートされた関数が実行される前にメールを送信するためのデコレータです。
send_mailメソッドをラップします。引数:
inf(dict): メールパラメータ情報。server_info(dict): SMTPサーバー情報。
戻り値: デコレータ関数。
使用例:
@app.email(inf_dict, server_info_dict) def process_and_notify(): # ... 処理 ... return "Processed"
parse_query_string(self, query_string)動作: クエリ文字列を解析し、キーと値のペアを含む辞書を返します。URLデコードとサニタイズを行います。
引数:
query_string(str): 解析するクエリ文字列。
戻り値: パラメータの辞書 (dict)。
get_params(self)動作: GET、POST、コマンドライン引数、PATH_INFOからすべてのパラメータを収集し、統合された辞書として返します。multipart/form-data のPOSTリクエストも
tkFormDataを使用して処理します。引数: なし
戻り値: 取得したパラメータの辞書 (dict)。
sanitize(self, value, allowed_characters=None)動作: ユーザー入力をサニタイズします。HTMLタグを無効化し、特定の文字をエスケープします。オプションで許可された文字セット以外の文字をアンダースコアに置換できます。
引数:
value(str): サニタイズする文字列。allowed_characters(str, optional): 許可する文字の正規表現パターン。
戻り値: サニタイズされた文字列 (str)。
desanitize(self, sanitized_input)動作:
sanitizeメソッドによってエスケープされたHTMLエンティティを元の文字に戻します。引数:
sanitized_input(str): デサニタイズする文字列。
戻り値: 元の形式の文字列 (str)。
render_template(self, template_file, params, extract_body=True)動作: 指定されたテンプレートファイル(またはテンプレート文字列)とパラメータを使用して、Jinja2テンプレートをレンダリングします。
extract_bodyがTrueの場合、HTMLの<body>タグ内のコンテンツのみを抽出します。引数:
template_file(str): テンプレートファイルのパス(self.templates_dirからの相対パス)、または直接テンプレート文字列。params(dict): テンプレートに渡すデータ。extract_body(bool, optional): レンダリング結果からHTML<body>タグの内容のみを抽出するかどうか。デフォルトはTrue。
戻り値: レンダリングされたテキスト (str)。
render_template_from_file(self, template_name, context)動作:
self.templates_dir内の指定されたテンプレートファイルを読み込み、Jinja2を使ってレンダリングします。引数:
template_name(str): テンプレートファイル名。context(dict): テンプレートに渡すコンテキストデータ。
戻り値: レンダリングされたテキスト (str)。
get(self, url, params=None, headers=None)動作: 指定されたURLにHTTP GETリクエストを送信します。
引数:
url(str): リクエスト先のURL。params(dict, optional): クエリパラメータ。headers(dict, optional): HTTPヘッダー。
戻り値:
requests.Responseオブジェクト。
post(self, url, params=None, headers=None, body=None)動作: 指定されたURLにHTTP POSTリクエストを送信します。
bodyが辞書の場合、JSON形式に変換しContent-Type: application/jsonヘッダーを設定します。引数:
url(str): リクエスト先のURL。params(dict, optional): クエリパラメータ。headers(dict, optional): HTTPヘッダー。body(str or dict, optional): リクエストボディのデータ。
戻り値:
requests.Responseオブジェクト。
put(self, url, params=None, headers=None, body=None)動作: 指定されたURLにHTTP PUTリクエストを送信します。
bodyが辞書の場合、JSON形式に変換しContent-Type: application/jsonヘッダーを設定します。引数:
url(str): リクエスト先のURL。params(dict, optional): クエリパラメータ。headers(dict, optional): HTTPヘッダー。body(str or dict, optional): リクエストボディのデータ。
戻り値:
requests.Responseオブジェクト。
delete(self, url, params=None, headers=None)動作: 指定されたURLにHTTP DELETEリクエストを送信します。
引数:
url(str): リクエスト先のURL。params(dict, optional): クエリパラメータ。headers(dict, optional): HTTPヘッダー。
戻り値:
requests.Responseオブジェクト。
request(self, method, url, params=None, headers=None, body=None)動作: 汎用的なHTTPリクエストメソッドです。指定されたHTTPメソッド (GET, POST, PUT, DELETE) でURLにリクエストを送信し、
requests.Responseオブジェクトを返します。引数:
method(str): HTTPメソッド (例: "GET", "POST")。url(str): リクエスト先のURL。params(dict, optional): クエリパラメータまたはフォームデータ。headers(dict, optional): HTTPヘッダー。body(str or dict, optional): POST/PUTリクエストのボディデータ。
戻り値:
requests.Responseオブジェクト、またはエラー情報を含む辞書。
call_route_function(self, action, query, *args, **kwargs)動作:
self.routesに登録されている、指定されたactionに対応する関数を呼び出します。引数:
action(str): 呼び出す関数のキー(ルート名)。query(dict): リクエストのクエリパラメータ辞書。*args,**kwargs: 呼び出す関数に渡す追加の引数。
戻り値: ルート関数の戻り値。
run(self, redirect=True, error_handler=None)動作: アプリケーションのエントリーポイントです。CGIリクエストを処理し、ルーティングメカニズムを通じて適切なハンドラ関数を実行します。
引数:
redirect(bool, optional):builtins.printをself.print_customにリダイレクトするかどうか。デフォルトはTrue。error_handler(callable, optional): カスタムのエラーハンドラ関数。指定されない場合はデフォルトのJSONエラー応答を使用。
戻り値: ルート関数の戻り値。
main scriptとして実行したときの動作
tkCGIApplication.py は、通常、他のスクリプトからインポートされるライブラリとして設計されています。ソースコードには if __name__ == "__main__": ブロックが存在しないため、このファイルを直接Pythonインタプリタで実行した場合でも、特別なテストコードやアプリケーションの起動ロジックは実行されません。
代わりに、このライブラリはCGI環境で動作することを前提としています。Webサーバー(ApacheやNginxなど)がCGIスクリプトとして tkCGIApplication のインスタンスを生成し、app.run() メソッドを呼び出すことで、リクエスト処理が開始されます。
例えば、以下のようなCGIスクリプト内で利用されることが想定されます。
#!/usr/bin/env python3
from tkCGIApplication import tkCGIApplication
import json
app = tkCGIApplication(__name__)
# 設定の読み込み (例)
app.configure(log_path="/var/log/my_cgi_app.log")
@app.route('/')
def index():
app.init_html(title="My CGI App")
return "<h1>Welcome to My CGI Application!</h1>"
@app.route('/api/status')
def get_status():
app.init_html(target="json")
return json.dumps({"status": "ok", "timestamp": app.datetime.now().isoformat()})
if __name__ == '__main__':
app.run()
このようなCGIスクリプトがWebサーバーによって実行されると、app.run() が呼び出され、リクエストに応じた処理が実行されます。