what makes pyramid unique
TRANSCRIPT
![Page 1: What makes pyramid unique](https://reader035.vdocuments.mx/reader035/viewer/2022062710/55959f3b1a28ab572d8b46b2/html5/thumbnails/1.jpg)
What Makes Pyramid Unique!
Django & Pylons Con 2012aodag
![Page 2: What makes pyramid unique](https://reader035.vdocuments.mx/reader035/viewer/2022062710/55959f3b1a28ab572d8b46b2/html5/thumbnails/2.jpg)
お前誰よ
Atsushi Odagiri
株式会社ビープラウド
http://twitter.com/aodaghttp://facebook.com/aodag
![Page 3: What makes pyramid unique](https://reader035.vdocuments.mx/reader035/viewer/2022062710/55959f3b1a28ab572d8b46b2/html5/thumbnails/3.jpg)
Pyramid 仕事で使ってます
機能追加のパッチを投げましたPythonは1.5から。
Pyramidは、repoze.bfg1.2のころから。
![Page 4: What makes pyramid unique](https://reader035.vdocuments.mx/reader035/viewer/2022062710/55959f3b1a28ab572d8b46b2/html5/thumbnails/4.jpg)
今日のお話
Pyramidって何?
どんな特徴が?実際どんな開発の仕方?
![Page 5: What makes pyramid unique](https://reader035.vdocuments.mx/reader035/viewer/2022062710/55959f3b1a28ab572d8b46b2/html5/thumbnails/5.jpg)
Pyramidとは?
Pylonsプロジェクトの
Webアプリケーションフレームワーク
Simple, Fast, Tested, Documented
No ORM, No Template Engine.
![Page 6: What makes pyramid unique](https://reader035.vdocuments.mx/reader035/viewer/2022062710/55959f3b1a28ab572d8b46b2/html5/thumbnails/6.jpg)
Pyramidができるまで
WSGI Zope
Pylons Repoze
Pyramid
![Page 7: What makes pyramid unique](https://reader035.vdocuments.mx/reader035/viewer/2022062710/55959f3b1a28ab572d8b46b2/html5/thumbnails/7.jpg)
Zopeから受け継いだもの
Zope Component ArchitectureURLトラバーサル
コンテキストベースのセキュリティ機構
![Page 8: What makes pyramid unique](https://reader035.vdocuments.mx/reader035/viewer/2022062710/55959f3b1a28ab572d8b46b2/html5/thumbnails/8.jpg)
Pylonsから受け継いだもの
WebOb, BeakerなどのWSGIコンポーネント
URLパターンでのディスパッチ
PasteScript(ただしPython3対応のために独自コマンドとして取り込まれた)
![Page 9: What makes pyramid unique](https://reader035.vdocuments.mx/reader035/viewer/2022062710/55959f3b1a28ab572d8b46b2/html5/thumbnails/9.jpg)
Pyramidの設計方針
仕組みをたくさん提供するポリシーを押し付けないコンポーネント指向を直接見せないことさらマイクロフレームワークを意識しない
![Page 10: What makes pyramid unique](https://reader035.vdocuments.mx/reader035/viewer/2022062710/55959f3b1a28ab572d8b46b2/html5/thumbnails/10.jpg)
特徴的なしくみ
デコレータベースの設定さまざまなフック例外ビュー
![Page 11: What makes pyramid unique](https://reader035.vdocuments.mx/reader035/viewer/2022062710/55959f3b1a28ab572d8b46b2/html5/thumbnails/11.jpg)
デコレータベースの設定
ユニットテスト中に副作用のあるデコレータ
が実行されると、うっとおしいですよね?
![Page 12: What makes pyramid unique](https://reader035.vdocuments.mx/reader035/viewer/2022062710/55959f3b1a28ab572d8b46b2/html5/thumbnails/12.jpg)
デコレータベースの設定
デコレータでビューなどを登録できる
ただし、いきなり登録するのではなくConfigurator.scan()をトリガーとして、初めて登録される。
![Page 13: What makes pyramid unique](https://reader035.vdocuments.mx/reader035/viewer/2022062710/55959f3b1a28ab572d8b46b2/html5/thumbnails/13.jpg)
さまざまなフック
フレームワークの途中に処理を割り込ませたいこと、
たくさんありますよね?
![Page 14: What makes pyramid unique](https://reader035.vdocuments.mx/reader035/viewer/2022062710/55959f3b1a28ab572d8b46b2/html5/thumbnails/14.jpg)
さまざまなフック
NewRequestTweenBeforeRenderなど
![Page 15: What makes pyramid unique](https://reader035.vdocuments.mx/reader035/viewer/2022062710/55959f3b1a28ab572d8b46b2/html5/thumbnails/15.jpg)
例外ビュー
処理を打ち切って、さっさと
レスポンスを返したいこと、
たくさんありますよね?
![Page 16: What makes pyramid unique](https://reader035.vdocuments.mx/reader035/viewer/2022062710/55959f3b1a28ab572d8b46b2/html5/thumbnails/16.jpg)
例外ビュー
例外クラスごとにそれぞれビューを設定可能
![Page 17: What makes pyramid unique](https://reader035.vdocuments.mx/reader035/viewer/2022062710/55959f3b1a28ab572d8b46b2/html5/thumbnails/17.jpg)
view predicate
同じ処理だけど、Ajaxリクエストと
ブラウザリクエストでテンプレートとか
変更したいよね?
![Page 18: What makes pyramid unique](https://reader035.vdocuments.mx/reader035/viewer/2022062710/55959f3b1a28ab572d8b46b2/html5/thumbnails/18.jpg)
view predicate
namecontextroute_namerequest_typerequest_methodrequest_parammatch_param
xhracceptheaderpath_infocustom_predicate
![Page 19: What makes pyramid unique](https://reader035.vdocuments.mx/reader035/viewer/2022062710/55959f3b1a28ab572d8b46b2/html5/thumbnails/19.jpg)
view predicate
@view_config(.... xhr=True, renderer="json")@view_config(... xhr=False, renderer="index.html")def get_something(request): .... return dict(items=items)
![Page 20: What makes pyramid unique](https://reader035.vdocuments.mx/reader035/viewer/2022062710/55959f3b1a28ab572d8b46b2/html5/thumbnails/20.jpg)
その他いろいろ
シングルトンは存在しない継承を多様しない
![Page 21: What makes pyramid unique](https://reader035.vdocuments.mx/reader035/viewer/2022062710/55959f3b1a28ab572d8b46b2/html5/thumbnails/21.jpg)
開発を助けるコマンド群
pcreatepserve
pshellprequest
proutespviewsptweens
![Page 22: What makes pyramid unique](https://reader035.vdocuments.mx/reader035/viewer/2022062710/55959f3b1a28ab572d8b46b2/html5/thumbnails/22.jpg)
pcreate
プロジェクトテンプレート(Scaffold)を展開する開発開始時の土台を作成するツール
ユーザー定義のプロジェクトテンプレートも作成できる
![Page 23: What makes pyramid unique](https://reader035.vdocuments.mx/reader035/viewer/2022062710/55959f3b1a28ab572d8b46b2/html5/thumbnails/23.jpg)
pserve
Webアプリケーションを実行する
--reloadオプションで、ファイル更新を検地してリロードしてくれる
daemon化やモニタリングしてリスタートさせることも可能
![Page 24: What makes pyramid unique](https://reader035.vdocuments.mx/reader035/viewer/2022062710/55959f3b1a28ab572d8b46b2/html5/thumbnails/24.jpg)
pshell
Webアプリケーション実行時の環境を擬似的に作成して、Pythonシェルを起動する
![Page 25: What makes pyramid unique](https://reader035.vdocuments.mx/reader035/viewer/2022062710/55959f3b1a28ab572d8b46b2/html5/thumbnails/25.jpg)
prequest
Webアプリケーションをオフラインで実行して結果を確認できる
![Page 26: What makes pyramid unique](https://reader035.vdocuments.mx/reader035/viewer/2022062710/55959f3b1a28ab572d8b46b2/html5/thumbnails/26.jpg)
proutes, pviews, ptweens
アプリケーション構成を確認できる。
例えば:● URLパターンが実際にどのViewにマッチするの
か● 具体的なURLに対応するViewはどれか● Tweenの実行順序はどのようになっているのか
![Page 27: What makes pyramid unique](https://reader035.vdocuments.mx/reader035/viewer/2022062710/55959f3b1a28ab572d8b46b2/html5/thumbnails/27.jpg)
よく使うライブラリ、ツール
ZODB3SQLAlchemyzope.sqlalchemydeform/colanderWebHelperscliff
distributezc.buildoutnosealembic
![Page 28: What makes pyramid unique](https://reader035.vdocuments.mx/reader035/viewer/2022062710/55959f3b1a28ab572d8b46b2/html5/thumbnails/28.jpg)
有力なアドオン
pyramid_tmpyramid_deformpyramid_debugtoolbarpyramid_exclogpyramid_zodbconn
![Page 29: What makes pyramid unique](https://reader035.vdocuments.mx/reader035/viewer/2022062710/55959f3b1a28ab572d8b46b2/html5/thumbnails/29.jpg)
Pyramidベースのフレームワーク
SubstanceDKottiCornice
GroundHogMetaTG
![Page 30: What makes pyramid unique](https://reader035.vdocuments.mx/reader035/viewer/2022062710/55959f3b1a28ab572d8b46b2/html5/thumbnails/30.jpg)
Pyramidでの開発
2つのベースアーキテクチャ
ZODB + トラバーサル
SQLAlchemy + URLディスパッチ
![Page 31: What makes pyramid unique](https://reader035.vdocuments.mx/reader035/viewer/2022062710/55959f3b1a28ab572d8b46b2/html5/thumbnails/31.jpg)
ZODB + トラバーサル
URLパターンとかいらない!
URL -> オブジェクトツリー
URLでオブジェクト取得
例:URL : /great/bucho/show
トラバーサル : root['great']['bucho']. showがない?
showという名前のViewを呼ぶ
![Page 32: What makes pyramid unique](https://reader035.vdocuments.mx/reader035/viewer/2022062710/55959f3b1a28ab572d8b46b2/html5/thumbnails/32.jpg)
Pyramidでの開発 環境構築
mkvirtualenv pycon2012easy_install pyramidpcreate -s zodb pycon2012cd pycon2012python setup.py develop
![Page 33: What makes pyramid unique](https://reader035.vdocuments.mx/reader035/viewer/2022062710/55959f3b1a28ab572d8b46b2/html5/thumbnails/33.jpg)
Pyramidでの開発
追加のライブラリなど
pyramid_deformdeform_bootstrapcolanderpillowrepoze.filesaferepoze.folder
![Page 34: What makes pyramid unique](https://reader035.vdocuments.mx/reader035/viewer/2022062710/55959f3b1a28ab572d8b46b2/html5/thumbnails/34.jpg)
setup.pyに依存ライブラリを追加する
install_requires = [..."pyramid_deform","deform_bootstrap","colander","pillow","repoze.filesafe","repoze.folder",
![Page 35: What makes pyramid unique](https://reader035.vdocuments.mx/reader035/viewer/2022062710/55959f3b1a28ab572d8b46b2/html5/thumbnails/35.jpg)
iniファイルにアドオンを追加する
pyramid.includes = .... pyramid_deform deform_bootstrap
![Page 36: What makes pyramid unique](https://reader035.vdocuments.mx/reader035/viewer/2022062710/55959f3b1a28ab572d8b46b2/html5/thumbnails/36.jpg)
Pyramidでの開発
モデルを書く
class Document(Persistent): def __init__(self, name, contents): super(Document, self).__init__() self.__name__ = name self.contents = contents
![Page 37: What makes pyramid unique](https://reader035.vdocuments.mx/reader035/viewer/2022062710/55959f3b1a28ab572d8b46b2/html5/thumbnails/37.jpg)
Pyramidでの開発
ビューを書く
@view_config(context=Document, renderer='templates/document.pt')def document_view(request): return dict()
![Page 38: What makes pyramid unique](https://reader035.vdocuments.mx/reader035/viewer/2022062710/55959f3b1a28ab572d8b46b2/html5/thumbnails/38.jpg)
テンプレートを書く
<html><body><h1>${context.__name__}</h1><div>${structure:context.contents}</div></body></html>
![Page 39: What makes pyramid unique](https://reader035.vdocuments.mx/reader035/viewer/2022062710/55959f3b1a28ab572d8b46b2/html5/thumbnails/39.jpg)
pshellでモデルデータを登録
$ pshell development.ini>>> from pyconjp2012.models import Document>>> doc = Document('test-document', 'this-is-document')>>> root[doc.__name__] = doc>>> doc.__parent__ = root>>> import transaction>>> transaction.commit()
![Page 40: What makes pyramid unique](https://reader035.vdocuments.mx/reader035/viewer/2022062710/55959f3b1a28ab572d8b46b2/html5/thumbnails/40.jpg)
prequestで試してみよう
$ prequest development.ini /test-document<html><body><h1>test-document</h1><div>this-is-document</div></body></html>
![Page 41: What makes pyramid unique](https://reader035.vdocuments.mx/reader035/viewer/2022062710/55959f3b1a28ab572d8b46b2/html5/thumbnails/41.jpg)
pserveでWebアプリケーションを実行
pserve development.ini --reload
![Page 42: What makes pyramid unique](https://reader035.vdocuments.mx/reader035/viewer/2022062710/55959f3b1a28ab572d8b46b2/html5/thumbnails/42.jpg)
ユーザー入力フォーム
スキーマ定義
class AddDocumentSchema(c.Schema): name = c.SchemaNode(c.String()) contents = c.SchemaNode(c.String(), widget=w.RichTextWidget())
![Page 43: What makes pyramid unique](https://reader035.vdocuments.mx/reader035/viewer/2022062710/55959f3b1a28ab572d8b46b2/html5/thumbnails/43.jpg)
ユーザー入力(実装)
class AddDocumentView(FormView): schema = AddDocumentSchema() buttons = ('save',)
def save_success(self, params): doc = Document(**params) self.request.context[doc.__name__] = doc doc.__parent__ = self.request.context return HTTPFound(self.request.resource_url(doc))
![Page 44: What makes pyramid unique](https://reader035.vdocuments.mx/reader035/viewer/2022062710/55959f3b1a28ab572d8b46b2/html5/thumbnails/44.jpg)
pyramid_deform (表示)
${structure:form}
![Page 45: What makes pyramid unique](https://reader035.vdocuments.mx/reader035/viewer/2022062710/55959f3b1a28ab572d8b46b2/html5/thumbnails/45.jpg)
Chameleonのテンプレートマクロ(定義)
<html metal:define-macro="html"><head><!-- いろんなヘッダ -->
</head><body metal:define-slot="main"></body></html>
![Page 46: What makes pyramid unique](https://reader035.vdocuments.mx/reader035/viewer/2022062710/55959f3b1a28ab572d8b46b2/html5/thumbnails/46.jpg)
Chameleonのテンプレートマクロ(利用)
<html metal:use-macro="base.macros.html"><body metal:fill-slot="main">${form}</body></html>
![Page 47: What makes pyramid unique](https://reader035.vdocuments.mx/reader035/viewer/2022062710/55959f3b1a28ab572d8b46b2/html5/thumbnails/47.jpg)
まとめ
使う場合言われるほど面倒ではない難しいこともない
使い切る場合手をいれれられる箇所が多いので、相対的に難しく感じるかも?
![Page 48: What makes pyramid unique](https://reader035.vdocuments.mx/reader035/viewer/2022062710/55959f3b1a28ab572d8b46b2/html5/thumbnails/48.jpg)
(´ > ω < )こわくないよー
![Page 49: What makes pyramid unique](https://reader035.vdocuments.mx/reader035/viewer/2022062710/55959f3b1a28ab572d8b46b2/html5/thumbnails/49.jpg)
Pyramidの今後
Pyramidベースのフレームワークが発展していく
Python3対応?ああ、去年やってましたね。
テンプレートの標準サポートをなくす方針
![Page 50: What makes pyramid unique](https://reader035.vdocuments.mx/reader035/viewer/2022062710/55959f3b1a28ab572d8b46b2/html5/thumbnails/50.jpg)
Pyramidの今後
管理アプリが欲しい!今世界中のPylonsどもが実装している。
![Page 51: What makes pyramid unique](https://reader035.vdocuments.mx/reader035/viewer/2022062710/55959f3b1a28ab572d8b46b2/html5/thumbnails/51.jpg)
参考URL
The Pylons Project Documentation http://docs.pylonsproject.org/en/latest/index.html
Pyramid Documentation http://docs.pylonsproject.org/en/latest/docs/pyramid.html
Defending Pyramid's Design http://docs.pylonsproject.org/projects/pyramid/en/master/designdefense.html