fudii0921 commited on
Commit
e745a00
·
verified ·
1 Parent(s): d2ace32

Create app.py

Browse files
Files changed (1) hide show
  1. app.py +122 -0
app.py ADDED
@@ -0,0 +1,122 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import gradio as gr
2
+ import sys
3
+
4
+ # --- 設定: 許可されたIPアドレスのリスト ---
5
+ # ここにアクセスを許可したい具体的なクライアントIPアドレスをリストで設定してください。
6
+ ALLOWED_IPS = ["127.0.0.1", "::1", "192.168.1.100", "0.0.0.0"]
7
+ #ALLOWED_IPS = ["::1", "192.168.1.100", "0.0.0.0"]
8
+
9
+ def req_process(prompt: str):
10
+ return prompt+"が入力されました。"
11
+
12
+ # --- IPアドレス取得・チェック関数 ---
13
+ def get_client_ip(request: gr.Request, ins) -> tuple[str, gr.update, gr.update]:
14
+ """
15
+ gr.RequestオブジェクトからクライアントのIPアドレスを抽出し、許可リストと比較します。
16
+ 戻り値: (ip_outputへのメッセージ, outs_outputの表示状態を制御するgr.update, main_content_groupの表示状態を制御するgr.update)
17
+ """
18
+ if not request:
19
+ # IP情報がない場合は、エラーメッセージと全ての非表示を返す
20
+ return "IPアドレス情報が利用できませんでした。", gr.update(visible=False), gr.update(visible=False)
21
+
22
+ # 1. 実際のクライアントIPを特定する
23
+ client_ip = request.client.host
24
+ forwarded_for = request.headers.get("x-forwarded-for")
25
+
26
+ # 外部アクセスの場合にチェックすべきIP (X-Forwarded-Forの最初のIP)
27
+ check_ip = client_ip
28
+ if forwarded_for:
29
+ check_ip = forwarded_for.split(',')[0].strip()
30
+
31
+ # 2. IPアドレスのチェック
32
+ if check_ip in ALLOWED_IPS:
33
+ # --- IPが許可されている場合 ---
34
+
35
+ if forwarded_for:
36
+ display_msg = f"✅ アクセス許可: IPアドレスが許可リストに含まれています。\nクライアントIP (X-Forwarded-For): {check_ip}\n直接ホストIP: {client_ip}"
37
+ else:
38
+ display_msg = f"✅ アクセス許可: IPアドレスが許可リストに含まれています。\nクライアントIP (直接接続): {client_ip}"
39
+
40
+ # outs_output(非表示)、main_content_group(表示)
41
+ return display_msg, gr.update(visible=True), gr.update(visible=True)
42
+ else:
43
+ # --- IPが拒否された場合 ---
44
+
45
+ error_msg = f"❌ アクセス拒否: あなたのIPアドレス ({check_ip}) は許可されていません。\nアクセスを許可するには、ALLOWED_IPSリストにIPを追加してください。"
46
+
47
+ # outs_output(非表示)、main_content_group(非表示)
48
+ return error_msg, gr.update(visible=False), gr.update(visible=False)
49
+
50
+
51
+ # --- Gradio UIの構築 ---
52
+ with gr.Blocks(title="アクセスIPチェッカー(IP制限)") as demo:
53
+ gr.Markdown(
54
+ """
55
+ # Gradio アクセスIPアドレス確認ツール(IP制限付き)
56
+
57
+ このアプリケーションは、スクリプト内の `ALLOWED_IPS` リストに登録されたIPアドレスからのみ、
58
+ 「制限されたメインコンテンツ」セクション全体を表示します。
59
+
60
+ ---
61
+ """
62
+ )
63
+
64
+ # 1. IPチェック結果を表示するテキストボックス (非許可の場合もエラーメッセージ表示のために常に存在)
65
+ ip_output = gr.Textbox(
66
+ label="アクセスステータス (IPチェック結果)",
67
+ interactive=False,
68
+ lines=4,
69
+ value="ページロード時にアクセスチェックを実行します..."
70
+ )
71
+
72
+ # 2. 制限をかけたい主要なコンテンツを gr.Group で囲む
73
+ # 初期状態では非表示に設定
74
+ with gr.Group(visible=False) as main_content_group:
75
+ gr.Markdown(
76
+ """
77
+ ## 制限されたメインコンテンツエリア
78
+ このセクションは、許可されたIPアドレスからのみ表示されています。
79
+ """
80
+ )
81
+
82
+ # outs_outputを初期状態で非表示に設定 (Groupで囲まれているため visible=False は redundantだが、明確化のため残す)
83
+ outs_output = gr.Textbox(
84
+ label="アクセスステータス結果",
85
+ interactive=False,
86
+ lines=4,
87
+ value="アクセスステータスがアクティブです。",
88
+ )
89
+
90
+ ins_output = gr.Textbox(
91
+ label="プロンプト入力",
92
+ interactive=True,
93
+ lines=4
94
+ )
95
+
96
+ req_output = gr.Textbox(
97
+ label="リクエスト結果",
98
+ interactive=False,
99
+ lines=4
100
+ )
101
+
102
+ exec_button = gr.Button("🚀 実行", variant="primary")
103
+
104
+ exec_button.click(
105
+ fn=req_process,
106
+ inputs=[ins_output],
107
+ outputs=[req_output]
108
+ )
109
+
110
+ # ページのロードが完了したときに、自動的にIPアドレスのチェック関数を呼び出す
111
+ # 戻り値は ip_output の内容、outs_output の表示状態、main_content_group の表示状態の3つ
112
+ demo.load(
113
+ fn=get_client_ip,
114
+ inputs=[ins_output],
115
+ outputs=[ip_output, outs_output, main_content_group]
116
+ )
117
+
118
+ # デモの起動 (ローカルで実行する場合)
119
+ if __name__ == "__main__":
120
+ print(f"許可されたIPアドレス: {ALLOWED_IPS}")
121
+ print("Gradioアプリケーションを起動します。")
122
+ demo.launch()