The lightweight nature of PHP allowed them to move processing tasks from the database to PHP in order to improve scaling. Ebay does this in a radical way. They moved nearly all work out of the database and into applications, including joins, an operation we normally think of as the job of the database.ってことが、ここに書いてあった。
Tempita は MIT-style license の元で利用可能です。
Tempita は積極的に開発されていますが、野心的なプロジェクトではありません。だから、テンプレートの世界を支配しようなんてものじゃなくて、新しい特徴を追加するのが目的のものです。私が作りたいと思ったものは、 % と string.Template だけじゃ不十分なときに使えるような、小さなテンプレート言語です。
(略)
インターフェースは string.Template に見えるように作ってあります。テンプレートオブジェクトは、こんなふうに作ります。
>>> import
>>> tmpl = tempita.Template("""Hello {{name}}""")
>>> tmpl.substitute(name='Bob')
'Hello Bob'
クラスを飛ばすこともできます。
>>> tempita.sub("Hello {{name}}", name='Alice')
'Helo Alice'
この言語は任意の Python で実行できます。だからあなたのテンプレートがより信頼できるものになります。
また、テンプレートに名前をつけることもできます。これによってエラーが起こったとき、その名前が表示されるので便利です。
>>> tmpl = tempita.Template('Hi {{name}}', name='tmpl')
>>> tmpl.substitute()
Traceback (most recent call last):
...
NameError: name 'name' is not defined at line 1 column 6 in file tmpl
substitute(...) の中身が引数になるような、デフォルトで使えるネームスペースを与えることもできます。
>>> tmpl = tempita.Template(
... 'Hi {{upper(name)}}',
... namespace=dict(upper=lambda s: s.upper()))
>>> tmpl.substitute(name='Joe')
'Hi JOE'
最後に、 substitute 関数にディクショナリオブジェクトを引数で渡すこともできます。
>>> name = 'Jane' >>> tmpl.substitute(locals()) 'Hi JANE'
HTML を作るのには、もっと便利なテンプレート HTML Template もあります。
Template.from_filename(filename, namespace={}, encoding=None) を使えば、ファイル名からテンプレートを作ることもできます。こんなふうに。
Template(open(filename, 'rb').read().decode(encoding),
name=filename, namespace=namespace)
Tempita は Unicode を"優雅に"扱います。 Template オブジェクトは default_encoding の属性を持っています。
unicode と str のオブジェクトが混ざっているときに、それを使います。こんなふうに
>>> tmpl = tempita.Template(u'Hi {{name}}')
>>> tmpl.substitute(name='Jos\xc3\xa9')
u'Hi Jos\xe9'
>>> tmpl = tempita.Template('Hi {{name}}')
>>> tmpl.substitute(name=u'Jos\xe9')
'Hi Jos\xc3\xa9'
デフォルトのエンコーディングは UTF8 です。
言語はとってもシンプルで、すべての要素は {{ごにょごにょ}} って感じになってます。
変数や式を変数や式を挿入するには、 {{expression}} を使います。式の中では }} を使うことはできませんが、 } } なら使えます(間にスペースがある)。filter もこんなふう {{expression | filter}}にすれば渡すことができます。たとえば{{expression | repr}}とか。これは{{repr(expression)}}と同じです。 こっち表現のほうが好きな人もいるでしょう。この表現は Django と同じです。ネームスペースは共有されているので、 repr はネームスペースの中の単なるオブジェクトです。
もしテンプレートのなかで {{ や }} を使いたいときは、組込み変数である {{start_braces}} と {{end_braces}} を使います。エスケープ文字はありません。
デフォルト変数をテンプレートの中出設定するためのコマンドもあります。たとえばこんな。
{{default width = 100}}
こうしておけばテンプレートの中で width はいつも 100 です。たとえば tmpl.substitute(width=200) とかやると、この効果はありません。
値が未定義のときにだけ使われます。また、 = の右側にはどんな式を書いても OK です。
if 文はこんな風に書けます。
{{if 条件式}}
true のときの処理
{{elif 別の条件式}}
そのときの処理
{{else}}
最後の処理
{{endif}}
命令だけの行は、評価されたときは取り除かれます。後に続く : は自由です。
ループにも、別に驚くことはありません。こんな風に書きます。
{{for a, b in items}}
{{a}} = {{b | repr}}
{{endfor}}
import md5, base64, random, MySQLdb, sys, pickle
def openDB():
return MySQLdb.connect(db="dbnane", host="dbhost.example.ne.jp", user="dbuser", passwd="dbpasswd")
secret_key = "gonyogonyo"
def getSessionKey():
con = openDB()
cur = con.cursor()
while 1:
session_key = md5.new(str(random.randint(0, sys.maxint - 1)) + str(random.randint(0, sys.maxint - 1)) + secret_key).hexdigest()
cur.execute("select session_key from mysession where session_key='%s'" % session_key)
r = cur.fetchall()
if len(r) == 0:
break
cur.close()
con.close()
return session_key
def session_encode(data):
return base64.encodestring( pickle.dumps(data))
def saveSession(session_key, session_data, session_expires):
con = openDB()
cur = con.cursor()
cur.execute("select session_key from mysession where session_key='%s'" % session_key)
r = cur.fetchall()
if len(r) == 1:
cur.execute('update mysession set session_data="%s" where session_key="%s"' % (session_encode(session_data), session_key))
cur.execute('update mysession set expire_date="%s" where session_key="%s"' % (session_expires, session_key))
elif len(r) == 0:
cur.execute("insert into mysession (session_key, session_data, expire_date) values('%s','%s','%s')" %
( session_key, session_encode(session_data), session_expires))
else:
raise Exception
cur.close()
con.close()