■フォルダと階層
とゆーわけで、マイペースでPyPageな第二弾です。
今回は、フレーム付きページの動的生成と、PyPage 固
有の PP モジュールについてお話したいと思います。
その前に、メインフォルダにテストページを散らかし
ておくのもなんですから、test というフォルダを pub
フォルダの下に作ってください。
ここに HTML ファイルを置く分には問題無いのですが、
Python モジュールを置くなら、モジュール参照のために
__init__.py ファイルを用意してください(私はうっか
り忘れて、しばらく悩みました)
※__init__.py ファイル・・・フォルダをパッケージと
して Package.Module のように参照するために、フォ
ルダに必ず入れておくファイル。本来、パッケージの
初期化内容を書くのだが、中身が無いブランクファイ
ルでもかまわない。
アドレスの書き方は、pub フォルダ下ですから、
http://localhost:8000/test/ となります。
なお、pyp フォルダのように、pub より上のフォルダ
を参照するときは、
http://localhost:8000/pyp/ のように書きます
それでは、以降はこの /pub/test/ 以下で作業を行う
ものとします。
※今回の話題の詳細な説明については、
pyplib/handler.py の内部ドキュメントに詳しいので、
そちらを参照してください。
■フレーム付きページの生成
フレーム付きのページも、フレーム内のページを別個
に設定するなら、別に普通に書けば終わります。
#---pub/test/test3a.py---
page_top_content='''<html>
<head>
<title>TEST3 FRAME</title>
</head>
<frameset cols="20%,50%">
<frame src="f0.html" name="frame-0" />
<frame src="f1.html" name="frame-1" />
</frameset>
</html>'''
def page(pc):
pc.send_head()
pc.write(page_top_content)
#---pub/test/test3a.py---
ところが、フレーム内のページを1モジュールで書く
となると、話が一気に複雑になります。
#---pub/test/test3b.py---
page_top_content='''<html>
<head>
<title>TEST3 FRAME</title>
</head>
<frameset cols="50%,50%">
<frame src="test3b/f0" name="frame-0" />
<frame src="test3b/f1" name="frame-1" />
</frameset>
</html>'''
def page(pc):
pc.send_head()
pc.write(page_top_content)
page_f0_content='''<html>
<head>
<title>FRAME-0</title>
<style>
p{text-align:center;font-size:48pt;color:blue}
</style>
</head>
<body>
<p>FRAME-0</p>
</body>
</html>'''
page_f1_content='''<html>
<head>
<title>FRAME-1</title>
<style>
p{text-align:center;font-size:48pt;color:red}
</style>
</head>
<body>
<p>FRAME-1</p>
</body>
</html>'''
def page_f0(pc):
pc.send_head()
pc.write(page_f0_content)
def page_f1(pc):
pc.send_head()
pc.write(page_f1_content)
#---pub/test/test3b.py---
モジュール test3b.py 内にフレーム内のページを生成
するスクリプトを埋め込む場合は、生成するページのア
ドレスを test3b/ の下とします。
さらに、生成するページの名前を name とすると、
page_name 関数が、page 関数と同じ役割を果たします。
※詳細ルールについては、/pyplib/handler.py参照
なお、フレーム内ページから、画像などを相対パスで
参照する際、トップページより一つ下のディレクトリに
いることに気をつけてください。
例えば今の例で、test3b.py モジュールと同じディレ
クトリにある fig0.jpg というファイルを参照する場合、
"../fig0.jpg"と書く必要があります。
■PPモジュールについて・・・
PyPage は、拡張子.py のモジュールかわりに、拡張子.
pp のモジュールを指定することができます。
参照の仕方は.py と同じく拡張子を省く書き方なので、
同じフォルダに spam.py と spam.pp を置いておくと、
spam.py の方を参照してしまうので、注意してください。
というか・・・ PP モジュールはプリプロセッサでコ
ンパイルされて、PY モジュールに変換されて適用され、
以後は、PY モジュールを参照する、というシステムにな
っています。
PP モジュールでは、一部タグを使用することによって
モジュールが書きやすくなっています。
以下は、簡単なPPモジュールの例です。
#---test4.pp---
def page(pc):
pc.send_head()
<write><html>
<head>
<title>TEST4(PP)</title>
</head>
<body>
<h1>TEST4-PP-Module!</h1>
</body>
</html></write>
#---test4.pp---
Zope の DTML などとは異なり、HTML にスクリプトを
埋め込んだのはなく、スクリプトに HTML を埋め込む形
式になりますので、<write> タグの最初の位置だけは、
Python スクリプトの形式に従って字下げしてください
(後は自由です)
PP モジュールでは、この他にも便利な機能があります
が、習得速度にあわせて順次使っていけばよいと思いま
す。
なお詳細は、/pyplib/ppc.py の内部ドキュメントを参
照してください。
■フレーム間通信の例
さて、まとめとしまして、別フレームから信号を受け
取ると表示する画像を変化させる、というページを書い
てみます。
まず、fig0.png、fig1.png という2枚の PNG ファイ
ルを用意ください(なんでもかまいませんが、ヤバい絵
を使う場合は、周囲に注意してください)
#---test5.py---
page_top_context='''<html>
<head>
<title>TEST5 FRAMES</title>
</head>
<frameset cols="20%,50%">
<frame src="test5/f0" name="f0" />
<frame src="test5/f1" name="f1" />
</frameset>
</html>
'''
page_f0_context='''<html>
<head>
<title>FRAME-0</title>
</head>
<body>
<form action="/test/test5/f1" method="post" target="f1">
<input type="radio" name="fig_n" value="fig0" />FIG-0<br>
<input type="radio" name="fig_n" value="fig1" />FIG-1<br>
<input type="submit" />
</form>
</body>
</html>
'''
page_f1_context='''<html>
<head>
<title>FRAME-1</title>
</head>
<body>
<p><img src="../%(fig_num)s.png">
</p>
</body>
</html>
'''
def page(pc):
pc.send_head()
pc.write(page_top_context)
def page_f0(pc):
pc.send_head()
pc.write(page_f0_context)
def page_f1(pc, fig_n=None):
if not fig_n:
fig_num = "fig0"
else:
fig_num = str(fig_n)
pc.send_head()
pc.write(page_f1_context % vars())
#---test5.py---
うまく切り替えが出来たでしょうか?(最初は fig0.
png が表示されるようになっています)。
とっかかりはこの程度で十分だと思いますので、まず
は使ってみてください。
次回、があるかどうかは不明・・・
2003/09/29 12:55:30 機械伯爵