トップ   編集 凍結 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS

E71:MWSチュートリアル(2)

Last-modified: 2013-08-24 (土) 02:14:21 (3898d)
Top / E71:MWSチュートリアル(2)

E71:MWSチュートリアル(2)

引き続き、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!!!

ここでは、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

まずは.htaccessから。ここから説明した方が、仕組みがわかりやすいから。

# setting Handler 
SetHandler mod_python ←(1)
# Add Python Handler
PythonHandler indexbasic ←(2)
# Debug On
PythonDebug On ←(3)
# Option OFF
Options None ←(4)
  1. apacheのハンドラーとしてmod_pythonを指定します。
  2. mod_pythonには様々なhandlerモジュールがあるのですが、indexbasicというファイル名のPythonHandler?を起動する、っていう意味になります。
  3. PythonのデバックモードをONにします。それだけ
  4. Optionは特に設定しません。何が設定できるかはそのうち調べます笑

まあ、とりあえず最初動かすのに重要なのは、(1)、(2)くらいです。

(1)、(2)の設定で、このディレクトリ内を指し示すURLだった場合、idnexbaxicってファイル名のファイルがmod_pythonから実行されることになります。

indexbasic.py

次に、実際に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
  1. apachepspモジュールをインポートします。お約束
  2. handler関数を定義します。mod_pythonのお約束で、Python***HandlerのPythonを除いた部分を関数名として実行します。つまり、今回の場合、.htaccessでハンドラーをPythonHandler?を使うと定義しているので、indexbasicの中には、「handler」関数を定義する必要があります。
    して、mod_python的には、reqってところにリクエストオブジェクトを詰めてhandler関数を呼び出してくれます。
  3. 実際に処理を行うクラス「HRHandler」を定義します。これは「Nokia Mobile Web Server How to Develop Content」の名前をそのままパクってるので、HRの意味は不明です笑
  4. コンストラクタ的に特にやることはないので、空振りさせます。
  5. HRHandlerで行う処理を記述するメソッドを定義します。
  6. ページタイトルを設定します。
  7. 生成するページの内容を設定します。
  8. この塊で、content typeとか、ヘッダー情報とかを設定します。ここでは、受け取ったリクエストオブジェクトに直接設定してます。
  9. ここ2行が重要! PSPでテンプレートファイルを読み込んで、runメソッドでテンプレートに値を挿入し、結果をリクエストオブジェクトにつっこんでる、そんな動作をさせてます。
    具体的には、runメソッドの中で受け渡している内容、contentとかhtml_headとか(クオートされているやつ)がplain.pspに定義されていて、その中にcontent変数とかrequ.html_headとかをいれてやる、ってイメージになります。

ざっと見るとこんな感じです。最後にテンプレートとなっている「plain.psp」を見てみましょう。

plain.psp

ソースコードを以下に示します。

<!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とよく似てます。内容も、解説するまでもないと思うので、割愛。

動作画面

さてさて、実際に動作させてみると、以下のようなサイトが表示されます。

Screenshot0037.jpg

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