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 │   ├── PKG-INFO │   ├── SOURCES.txt │   ├── dependency_links.txt │   ├── entry_points.txt │   ├── not-zip-safe │   ├── requires.txt │   └── top_level.txt ├── MyWebsite.sqlite ├── README.txt ├── development.ini ├── mywebsite │   ├── __init__.py │   ├── __init__.pyc │   ├── models.py │   ├── models.pyc │   ├── scripts │   │   ├── __init__.py │   │   ├── __init__.pyc │   │   ├── initializedb.py │   │   └── initializedb.pyc │   ├── static │   │   ├── favicon.ico │   │   ├── footerbg.png │   │   ├── headerbg.png │   │   ├── ie6.css │   │   ├── middlebg.png │   │   ├── pylons.css │   │   ├── pyramid-small.png │   │   ├── pyramid.png │   │   └── transparent.gif │   ├── templates │   │   └── mytemplate.pt │   ├── tests.py │   ├── tests.pyc │   ├── views.py │   └── views.pyc ├── production.ini ├── setup.cfg └── setup.py 5 directories, 37 files
とりあえず、今日はここまで。