Pyramidを使ってみる

Creating a Pyramid Project — The Pyramid Web Application Development Framework v1.4.9 を参考にしながら作ってみます。


とりあえず環境を作ります。virtualenv + virtualenvwrapper は導入済みとします。

$ mkvirtualenv pyramid
$ pip install pyramid
$ pip freeze > requirements.txt


導入されたパッケージはこんな感じ。

$ cat requirements.txt 
Chameleon==2.11
Mako==0.7.3
MarkupSafe==0.15
PasteDeploy==1.5.0
WebOb==1.2.3
distribute==0.6.28
pyramid==1.4
repoze.lru==0.6
translationstring==1.1
venusian==1.0a7
wsgiref==0.1.2
zope.deprecation==4.0.1
zope.interface==4.0.2


適当にディレクトリーを掘って、scaffoldを生成します。

$ cd path/to/your/application
$ pcreate -s alchemy MyWebsite


setup.py を叩くと、足りないパッケージを勝手にダウンロードしてくれるようです。

$ cd MyWebsite
$ python setup.py develop


依存するパッケージが増えました。

$ pip freeze
Chameleon==2.11
Mako==0.7.3
MarkupSafe==0.15
MyWebsite==0.0
PasteDeploy==1.5.0
Pygments==1.5
SQLAlchemy==0.8.0b2
WebOb==1.2.3
distribute==0.6.28
pyramid==1.4
pyramid-debugtoolbar==1.0.3
pyramid-tm==0.6
repoze.lru==0.6
transaction==1.4.0b1
translationstring==1.1
venusian==1.0a7
waitress==0.8.2
wsgiref==0.1.2
zope.deprecation==4.0.1
zope.interface==4.0.2
zope.sqlalchemy==0.7.1


requirements.txt を作り直しておきます。

$ pip freeze > requirements.txt


テストを走らせてみます。

$ cd MyWebsite
$ python setup.py test   
running test
running egg_info
writing requirements to MyWebsite.egg-info/requires.txt
writing MyWebsite.egg-info/PKG-INFO
writing top-level names to MyWebsite.egg-info/top_level.txt
writing dependency_links to MyWebsite.egg-info/dependency_links.txt
writing entry points to MyWebsite.egg-info/entry_points.txt
reading manifest file 'MyWebsite.egg-info/SOURCES.txt'
reading manifest template 'MANIFEST.in'
warning: no files found matching '*.rst'
warning: no files found matching '*.jpg' under directory 'mywebsite'
warning: no files found matching '*.txt' under directory 'mywebsite'
warning: no files found matching '*.mak' under directory 'mywebsite'
warning: no files found matching '*.mako' under directory 'mywebsite'
warning: no files found matching '*.js' under directory 'mywebsite'
warning: no files found matching '*.html' under directory 'mywebsite'
warning: no files found matching '*.xml' under directory 'mywebsite'
writing manifest file 'MyWebsite.egg-info/SOURCES.txt'
running build_ext
test_it (mywebsite.tests.TestMyView) ... ok

----------------------------------------------------------------------
Ran 1 test in 0.030s

OK


OKでした。
アプリを立ち上げてみます。

$ pserve development.ini 
Starting server in PID 12817.
serving on http://0.0.0.0:6543


Webブラウザhttp://localhost:6543/ にアクセスしてみます。


なにやらうまくいっていない雰囲気です。メッセージを読んでみます。

Pyramid is having a problem using your SQL database.  The problem
might be caused by one of the following things:

1.  You may need to run the "initialize_MyWebsite_db" script
    to initialize your database tables.  Check your virtual 
    environment's "bin" directory for this script and try to run it.

2.  Your database server may not be running.  Check that the
    database server referred to by the "sqlalchemy.url" setting in
    your "development.ini" file is running.

After you fix the problem, please restart the Pyramid application to
try it again.


DBを初期化していないのでエラーになっているようです。メッセージの指示通りに initialize_MyWebsite_db を実行してみます。

$ initialize_MyWebsite_db
usage: initialize_MyWebsite_db <config_uri>
(example: "initialize_MyWebsite_db development.ini")


引数が必要なようです。もう一度実行します。

$ initialize_MyWebsite_db development.ini
2012-12-29 22:11:39,357 INFO  [sqlalchemy.engine.base.Engine][MainThread] PRAGMA table_info("models")
2012-12-29 22:11:39,357 INFO  [sqlalchemy.engine.base.Engine][MainThread] ()
2012-12-29 22:11:39,358 INFO  [sqlalchemy.engine.base.Engine][MainThread] 
CREATE TABLE models (
	id INTEGER NOT NULL, 
	name TEXT, 
	value INTEGER, 
	PRIMARY KEY (id), 
	UNIQUE (name)
)


2012-12-29 22:11:39,358 INFO  [sqlalchemy.engine.base.Engine][MainThread] ()
2012-12-29 22:11:39,362 INFO  [sqlalchemy.engine.base.Engine][MainThread] COMMIT
2012-12-29 22:11:39,365 INFO  [sqlalchemy.engine.base.Engine][MainThread] BEGIN (implicit)
2012-12-29 22:11:39,366 INFO  [sqlalchemy.engine.base.Engine][MainThread] INSERT INTO models (name, value) VALUES (?, ?)
2012-12-29 22:11:39,366 INFO  [sqlalchemy.engine.base.Engine][MainThread] ('one', 1)
2012-12-29 22:11:39,367 INFO  [sqlalchemy.engine.base.Engine][MainThread] COMMIT


もう一度アプリを立ち上げて、ブラウザでアクセスしてみます。

$ pserve development.ini
Starting server in PID 12897.
serving on http://0.0.0.0:6543


今度はうまくいきました。
開発時には、ファイルを変更したら自動でデプロイしてくれる方が便利です。--reload オプション付きでアプリを立ち上げると、そのモードになるようです。

$ pserve development.ini --reload
Starting subprocess with file monitor
Starting server in PID 12948.
serving on http://0.0.0.0:6543


画面の右側に出ているデバッグツールバーを消すには、development.ini を変更してデバッグツールバーの読み込みを外せば良いようです。別ターミナルで development.ini を編集します。

----- development.ini ---
...
14 pyramid.includes =
15     #pyramid_debugtoolbar
16     pyramid_tm
...


おっと、development.iniのリロードがかかってアプリが落ちました。

development.ini changed; reloading...
-------------------- Restarting --------------------
Traceback (most recent call last):
...
ImportError: No module named #pyramid_debugtoolbar


コメントアウトは行頭でないといけないようです。ini ファイルだからでしょうか?

----- development.ini ---
...
14 pyramid.includes =
15 #    pyramid_debugtoolbar
16     pyramid_tm
...


落ちてしまったアプリを立ち上げ直します。

$ pserve development.ini --reload
Starting subprocess with file monitor
Starting server in PID 13029.
serving on http://0.0.0.0:6543


今度は大丈夫でした。


全体のディレクトリー構成は以下のようになっています。

$ tree
.
├── CHANGES.txt
├── MANIFEST.in
├── MyWebsite.egg-info
│&#160;&#160; ├── PKG-INFO
│&#160;&#160; ├── SOURCES.txt
│&#160;&#160; ├── dependency_links.txt
│&#160;&#160; ├── entry_points.txt
│&#160;&#160; ├── not-zip-safe
│&#160;&#160; ├── requires.txt
│&#160;&#160; └── top_level.txt
├── MyWebsite.sqlite
├── README.txt
├── development.ini
├── mywebsite
│&#160;&#160; ├── __init__.py
│&#160;&#160; ├── __init__.pyc
│&#160;&#160; ├── models.py
│&#160;&#160; ├── models.pyc
│&#160;&#160; ├── scripts
│&#160;&#160; │&#160;&#160; ├── __init__.py
│&#160;&#160; │&#160;&#160; ├── __init__.pyc
│&#160;&#160; │&#160;&#160; ├── initializedb.py
│&#160;&#160; │&#160;&#160; └── initializedb.pyc
│&#160;&#160; ├── static
│&#160;&#160; │&#160;&#160; ├── favicon.ico
│&#160;&#160; │&#160;&#160; ├── footerbg.png
│&#160;&#160; │&#160;&#160; ├── headerbg.png
│&#160;&#160; │&#160;&#160; ├── ie6.css
│&#160;&#160; │&#160;&#160; ├── middlebg.png
│&#160;&#160; │&#160;&#160; ├── pylons.css
│&#160;&#160; │&#160;&#160; ├── pyramid-small.png
│&#160;&#160; │&#160;&#160; ├── pyramid.png
│&#160;&#160; │&#160;&#160; └── transparent.gif
│&#160;&#160; ├── templates
│&#160;&#160; │&#160;&#160; └── mytemplate.pt
│&#160;&#160; ├── tests.py
│&#160;&#160; ├── tests.pyc
│&#160;&#160; ├── views.py
│&#160;&#160; └── views.pyc
├── production.ini
├── setup.cfg
└── setup.py

5 directories, 37 files


とりあえず、今日はここまで。