2010年12月2日

Python Webフレームワーク作ってみた


こんにちはPython界のメタ奇行子aodagです。今年もアドベントカレンダーの季節がやってきました。
去年は、zope/plone関連ということで、zopeとwsgiのあいのこrepoze.bfgを紹介してましたね。
そして今年!Pyramid紹介する気満々だったのですが、よく考えれば、repoze.bfgがPyramidになったわけで、
これでは去年とネタがかぶってしまう!
ということで、今年のネタはもうメタでやるしかないですねと。



まずは、こちらにちょっとだけ目を通してほしい。




これらを踏まえて、Webフレームワークを作ってみた。



こちらがそれをつかったアプリケーションの例だ。




import webstruct

class application(webstruct.Application): # '/'
db_url = "sqlite:///"
templates = ['example_templates']

@webstruct.view(template='index.html') # '/index'
def index(req):
return dict()

class users(webstruct.Application): # '/users'
@webstruct.view(template="users.html") # '/users/index'
def index(req):
users = webstruct.query(User).all()
return dict(users=users)

@webstruct.view(template="show_user.html", pattern=r'(?P\w+)') # '/users/{username}'
def show_user(req):
username = req.urlvars['username']
user = webstruct.query_one_or_404(User, username=username)
return dict(user=user)

from sqlalchemy import *

class User(webstruct.Model):
__tablename__ = 'users'
id = Column(Integer, primary_key=True)
username = Column(String(255), unique=True)
description = Column(UnicodeText)

webstruct.metadata.create_all()
webstruct.new_data(User, username='aodag', description=u"""aodag is creator of webstruct.
""")
webstruct.transaction.commit()
webstruct.run(application)




クラスや関数定義でURLを構築している。
一応それぞれのとこで、URLをコメントでつけておいた。
実際の動きはこちらのテストコード を見ると、なんとなく感じをつかめると思う



できごころだったんです。すいません。



いちおうここにソースおいてあるから、実装に興味がある人はどうぞ。
https://github.com/aodag/webstruct



さて、3日目にバトンを回さないといけないのですが、最近wsgiサーバーのmeinheldを作ったりなんだりしている尊敬すべき変態 mopemopeさんにお願いします。


関連リンク