LoginSignup
3
4

More than 5 years have passed since last update.

PythonでWeb framework を作ろう! (2)

Posted at

テンプレートを読み込んで表示してみよう!

表示するページ毎にプログラムを書いて、その中にHTMLコードを書くのってあまりエレガントじゃない。
ということで、テンプレートを読み込み表示させるまで作って行きたいと思います。

プロジェクトルートを取得せよ!

フレームワークを作る際に各機能毎にクラスファイルに分割していきたい。
その際に、クラスのオートロードを作成・動作させるにあたり設定ファイルである程度設定させます。
iniファイルに記述するという方法もあるんですが、作成したプロジェクトをデプロイ先で編集無しで動作させたいのでプロジェクトルートディレクトリを特定してこそれを基に設定フィアルの位置などを特定していきます。
で、まずプロジェクトルートディレクトリ特定の為の実装を記述します。

今回のディレクトリ構成は下記のようになっています。
+PROJECR_ROOT
++app
| +app
|  +templates(テンプレートファイル保管場所)
|   +index.tpl(テンプレートファイル)
++public
| +index.py(プログラム本体)
| +uwsgi.ini
| +uwsgi.pid
|+uwsgi.log
+templates
  +index.tpl(テンプレートファイル)
下記のように記述するとpublicディレクリの一つ上のディレクリ、つまりプロジェクトルートディレクトリが取得できます。

index.py(抜粋)
    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
# 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

これでブラウザに「はろーわーるど!!!!!」なりなんなり、テンプレートの中身が表示されたら成功です。

3
4
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
4