トップ   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS

E71:MWSチュートリアル(2) のバックアップの現在との差分(No.3)


  • 追加された行はこの色です。
  • 削除された行はこの色です。
*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''を
+mod_pythonには様々なhandlerモジュールがあるのですが、''indexbasic''というファイル名の''PythonHandler''を起動する、っていう意味になります。
+PythonのデバックモードをONにします。それだけ
+Optionは特に設定しません。何が設定できるかはそのうち調べます笑

■indexbasic.py
まあ、とりあえず最初動かすのに重要なのは、(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関数を定義します。
+
+
+
+
+
+
+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]
さてさて、実際に動作させてみると、以下のようなサイトが表示されます。

&ref(Screenshot0037.jpg);

なんか、全然表示される内容は大したことないけど、それでも表示されるとうれしかったりしますね〜