E71:MWSチュートリアル(2) の変更点
Top / E71:MWSチュートリアル(2)
- 追加された行はこの色です。
- 削除された行はこの色です。
- E71:MWSチュートリアル(2) へ行く。
- E71:MWSチュートリアル(2) の差分を削除
*E71:MWSチュートリアル(2) [#v3e8ed1a] 引き続き、''Mobile Web Server : How to Develop Content''を参考に、多少手を加えつつ進めていきます。 前回の内容は''[[E71:MWSチュートリアル]]''を参照のこと さてさて、今回はより高度な動的ページの作成とシャレ込みます! ちなみに、''Mobile Web Server : How to Develop Content''だと、「4.1 Basic HTML page with Python(P13)」あたりからの内容です。 **Basic HTML page with Python!!! [#pa2d09a0] ここでは、mod_pythonの機能でももっともベーシックで押さえどこ的な機能を使ってみます。 もちろん、これはNWSじゃなきゃ動かないわけではないです。(と思います笑) 前置きはこの辺にして、今回のデモにあたり新たに作成するファイル、ディレクトリを以下に示します。 E━data━Web server┳Data ┣conf ┣htdocs┳Framework ┃ ┣Web_Applications ┃ ┣rest ┃ ┣demo ┃ ┗demo2 ← 今回作成するディレクトリ ┃ ┣indexbasic.py ┃ ┣plain.psp ┃ ┗.htaccess ┗logs -.htaccess お約束のapacheの設定ファイル -indexbasic.py mod_pythonから実行されるHandlerが入ってるpythonスクリプト -plain.psp 動的ページを生成するpythonスクリプト。jsp見たいな感じかな〜 では、各ソースコードの内容を以下に示します。今回は前回よりもちゃんと解説を入れようかな〜 ***.htaccess [#i1da4dcb] まずは.htaccessから。ここから説明した方が、仕組みがわかりやすいから。 # setting Handler SetHandler mod_python ←(1) # Add Python Handler PythonHandler indexbasic ←(2) # Debug On PythonDebug On ←(3) # Option OFF Options None ←(4) +apacheのハンドラーとしてmod_pythonを指定します。 +mod_pythonには様々なhandlerモジュールがあるのですが、''indexbasic''というファイル名の''PythonHandler''を起動する、っていう意味になります。 +PythonのデバックモードをONにします。それだけ +Optionは特に設定しません。何が設定できるかはそのうち調べます笑 まあ、とりあえず最初動かすのに重要なのは、(1)、(2)くらいです。 (1)、(2)の設定で、このディレクトリ内を指し示すURLだった場合、idnexbaxicってファイル名のファイルがmod_pythonから実行されることになります。 ***indexbasic.py [#v3f9840c] 次に、実際にmod_pythonより実行されるソースコードを以下に示します。 # These modules must be import for the script to work in the server from mod_python import apache, psp ←(1) # template directory TMPL_DIR = "templates" MAIN_TMPL = "plain.psp" def handler(req): ←(2) """ Called by mod_python for every request Initializes and calls HRHandler """ # An instance of HRHandler is initialized hrh = HRHandler() result = hrh.handler(req) # HRHandler id deleted del hrh # The status code is returned to the server return result class HRHandler(object): ← (3) """ HRHandler is the main class of this script """ # Instance initialization def __init__(self): ←(4) pass # Nothing to need initialization def handler(self, requ): ←(5) """ Handle the request and run the template return apache.OK if no errors """ # Page title ←(6) title = 'Example Page' # Page content ←(7) content = 'This is the Example page content' # Give values to variables used in the plain.html template ←(8) requ.content_type = 'text/html, charset=UTF-8' requ.html_head = '' # Nothing in the html files head requ.html_body_attr = '' # No attributes for the html body # from the main template filename # fname = TMPL_DIR + '¥¥' + MAIN_TMPL fname = MAIN_TMPL # run the main template with the given data ←(9) template = psp.PSP(requ, filename=fname) template.run( { 'content':content, 'html_head':requ.html_head, 'html_body_attr':requ.html_body_attr, 'title':title } ) # delete the main template to save memry del template return apache.OK +''apache''、''psp''モジュールをインポートします。お約束 +handler関数を定義します。mod_pythonのお約束で、''Python***Handler''のPythonを除いた部分を関数名として実行します。つまり、今回の場合、.htaccessでハンドラーを''PythonHandler''を使うと定義しているので、''indexbasic''の中には、「''handler''」関数を定義する必要があります。&br; して、mod_python的には、reqってところにリクエストオブジェクトを詰めてhandler関数を呼び出してくれます。 +実際に処理を行うクラス「HRHandler」を定義します。これは「Nokia Mobile Web Server How to Develop Content」の名前をそのままパクってるので、HRの意味は不明です笑 +コンストラクタ的に特にやることはないので、空振りさせます。 +HRHandlerで行う処理を記述するメソッドを定義します。 +ページタイトルを設定します。 +生成するページの内容を設定します。 +この塊で、content typeとか、ヘッダー情報とかを設定します。ここでは、受け取ったリクエストオブジェクトに直接設定してます。 +ここ2行が重要! PSPでテンプレートファイルを読み込んで、runメソッドでテンプレートに値を挿入し、結果をリクエストオブジェクトにつっこんでる、そんな動作をさせてます。&br; 具体的には、runメソッドの中で受け渡している内容、contentとかhtml_headとか(クオートされているやつ)がplain.pspに定義されていて、その中にcontent変数とかrequ.html_headとかをいれてやる、ってイメージになります。 ざっと見るとこんな感じです。最後にテンプレートとなっている「''plain.psp''」を見てみましょう。 ***plain.psp [#r4a5f00a] ソースコードを以下に示します。 <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3c.org/TR/html4/loose.dtd"> <html> <head> <meta http-equiv="Content-Type" content="text/html; Charset=UTF-8"> <% req.write( html_head ) %> <title><%=title%></title> </head> <% req.write('<body ' + html_body_attr + '>') req.write(content) %> </body> </html> 何てことはないです。jspとよく似てます。内容も、解説するまでもないと思うので、割愛。 ***動作画面 [#i186fa72] さて、これをdemo2ってURLにセットして、 さてさて、実際に動作させてみると、以下のようなサイトが表示されます。 &ref(Screenshot0037.jpg); なんか、全然表示される内容は大したことないけど、それでも表示されるとうれしかったりしますね〜