テンプレートを読み込んで表示してみよう!
表示するページ毎にプログラムを書いて、その中にHTMLコードを書くのってあまりエレガントじゃない。
ということで、テンプレートを読み込み表示させるまで作って行きたいと思います。
プロジェクトルートを取得せよ!
フレームワークを作る際に各機能毎にクラスファイルに分割していきたい。
その際に、クラスのオートロードを作成・動作させるにあたり設定ファイルである程度設定させます。
iniファイルに記述するという方法もあるんですが、作成したプロジェクトをデプロイ先で編集無しで動作させたいのでプロジェクトルートディレクトリを特定してこそれを基に設定フィアルの位置などを特定していきます。
で、まずプロジェクトルートディレクトリ特定の為の実装を記述します。
今回のディレクトリ構成は下記のようになっています。
+PROJECR_ROOT
++app
| +app
| +templates(テンプレートファイル保管場所)
| +index.tpl(テンプレートファイル)
++public
| +index.py(プログラム本体)
| +uwsgi.ini
| +uwsgi.pid
|+uwsgi.log
+templates
+index.tpl(テンプレートファイル)
下記のように記述するとpublicディレクリの一つ上のディレクリ、つまりプロジェクトルートディレクトリが取得できます。
project_root = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
logger.info('project_root:' + project_root)
これで、目出度くプロジェクトのルートディレクリが取得できます。
テンプレートファイルを読み込め!
プロジェクトルートディレクリが特定できたので、ここを起点として設定ファイルやテンプレートフィアルの配置場所を指定していきます。
ファイルのフルパスなどは後々、コントローラの名称など絡めて決定していきますが、とりあえずここではPROJEC_ROOT/app/templates/index.tplを読み込みます。
今回作成するFrameworkでは、読み込んだテンプレートを配列に保存しておいて一行づつ読み込み、解釈して表示させるのでプログラムソースの見通しをよくする為にもViewの作成メソッドと、ファイルの読み込みメソッドを分離、ファイル読み込みメソッドはファイルを読み込んでlist型としてView作成メソッドに結果を返却、View作成メソッドは配列文字列に連結してapplicationメソッドに返却、applicationからuwsgiにViewを返却するといった形をとります。
コードは下記の通りです。
# index.py
# coding:utf-8
import logging
import datetime
import uuid
import os, sys
handler = logging.StreamHandler()
handler.setFormatter(logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s'))
logger = logging.getLogger()
logger.addHandler(handler)
logger.setLevel(logging.INFO)
project_root = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
def main():
# log
logger.info('test-log-dayo')
def application(env, start_response):
main()
logger.info('project_root:' + project_root)
start_response('200 OK', [('Content-type', 'text/html')])
str = createView('index.tpl')
return [str.encode("utf-8")]
def createView(file_name):
arr = readTemplate(project_root + '/app/templates/' + file_name)
str = ""
for line in arr:
str = str + line
return str
def readTemplate(file_name):
f = open(file_name, 'r')
arr = []
for line in f:
arr.append(line)
f.close()
return arr
これでブラウザに「はろーわーるど!!!!!」なりなんなり、テンプレートの中身が表示されたら成功です。