What makes pyramid unique

51
What Makes Pyramid Unique! Django & Pylons Con 2012 aodag

Transcript of What makes pyramid unique

Page 1: What makes pyramid unique

What Makes Pyramid Unique!

Django & Pylons Con 2012aodag

Page 2: What makes pyramid unique

お前誰よ

Atsushi Odagiri

株式会社ビープラウド

http://twitter.com/aodaghttp://facebook.com/aodag

Page 3: What makes pyramid unique

Pyramid 仕事で使ってます

機能追加のパッチを投げましたPythonは1.5から。

Pyramidは、repoze.bfg1.2のころから。

Page 4: What makes pyramid unique

今日のお話

Pyramidって何?

どんな特徴が?実際どんな開発の仕方?

Page 5: What makes pyramid unique

Pyramidとは?

Pylonsプロジェクトの

Webアプリケーションフレームワーク

Simple, Fast, Tested, Documented

No ORM, No Template Engine.

Page 6: What makes pyramid unique

Pyramidができるまで

WSGI Zope

Pylons Repoze

Pyramid

Page 7: What makes pyramid unique

Zopeから受け継いだもの

Zope Component ArchitectureURLトラバーサル

コンテキストベースのセキュリティ機構

Page 8: What makes pyramid unique

Pylonsから受け継いだもの

WebOb, BeakerなどのWSGIコンポーネント

URLパターンでのディスパッチ

PasteScript(ただしPython3対応のために独自コマンドとして取り込まれた)

Page 9: What makes pyramid unique

Pyramidの設計方針

仕組みをたくさん提供するポリシーを押し付けないコンポーネント指向を直接見せないことさらマイクロフレームワークを意識しない

Page 10: What makes pyramid unique

特徴的なしくみ

デコレータベースの設定さまざまなフック例外ビュー

Page 11: What makes pyramid unique

デコレータベースの設定

ユニットテスト中に副作用のあるデコレータ

が実行されると、うっとおしいですよね?

Page 12: What makes pyramid unique

デコレータベースの設定

デコレータでビューなどを登録できる

ただし、いきなり登録するのではなくConfigurator.scan()をトリガーとして、初めて登録される。

Page 13: What makes pyramid unique

さまざまなフック

フレームワークの途中に処理を割り込ませたいこと、

たくさんありますよね?

Page 14: What makes pyramid unique

さまざまなフック

NewRequestTweenBeforeRenderなど

Page 15: What makes pyramid unique

例外ビュー

処理を打ち切って、さっさと

レスポンスを返したいこと、

たくさんありますよね?

Page 16: What makes pyramid unique

例外ビュー

例外クラスごとにそれぞれビューを設定可能

Page 17: What makes pyramid unique

view predicate

同じ処理だけど、Ajaxリクエストと

ブラウザリクエストでテンプレートとか

変更したいよね?

Page 18: What makes pyramid unique

view predicate

namecontextroute_namerequest_typerequest_methodrequest_parammatch_param

xhracceptheaderpath_infocustom_predicate

Page 19: What makes pyramid unique

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

その他いろいろ

シングルトンは存在しない継承を多様しない

Page 21: What makes pyramid unique

開発を助けるコマンド群

pcreatepserve

pshellprequest

proutespviewsptweens

Page 22: What makes pyramid unique

pcreate

プロジェクトテンプレート(Scaffold)を展開する開発開始時の土台を作成するツール

ユーザー定義のプロジェクトテンプレートも作成できる

Page 23: What makes pyramid unique

pserve

Webアプリケーションを実行する

--reloadオプションで、ファイル更新を検地してリロードしてくれる

daemon化やモニタリングしてリスタートさせることも可能

Page 24: What makes pyramid unique

pshell

Webアプリケーション実行時の環境を擬似的に作成して、Pythonシェルを起動する

Page 25: What makes pyramid unique

prequest

Webアプリケーションをオフラインで実行して結果を確認できる

Page 26: What makes pyramid unique

proutes, pviews, ptweens

アプリケーション構成を確認できる。

例えば:● URLパターンが実際にどのViewにマッチするの

か● 具体的なURLに対応するViewはどれか● Tweenの実行順序はどのようになっているのか

Page 27: What makes pyramid unique

よく使うライブラリ、ツール

ZODB3SQLAlchemyzope.sqlalchemydeform/colanderWebHelperscliff

distributezc.buildoutnosealembic

Page 28: What makes pyramid unique

有力なアドオン

pyramid_tmpyramid_deformpyramid_debugtoolbarpyramid_exclogpyramid_zodbconn

Page 29: What makes pyramid unique

Pyramidベースのフレームワーク

SubstanceDKottiCornice

GroundHogMetaTG

Page 30: What makes pyramid unique

Pyramidでの開発

2つのベースアーキテクチャ

ZODB + トラバーサル

SQLAlchemy + URLディスパッチ

Page 31: What makes pyramid unique

ZODB + トラバーサル

URLパターンとかいらない!

URL -> オブジェクトツリー

URLでオブジェクト取得

例:URL : /great/bucho/show

トラバーサル : root['great']['bucho']. showがない?

showという名前のViewを呼ぶ

Page 32: What makes pyramid unique

Pyramidでの開発 環境構築

mkvirtualenv pycon2012easy_install pyramidpcreate -s zodb pycon2012cd pycon2012python setup.py develop

Page 33: What makes pyramid unique

Pyramidでの開発

追加のライブラリなど

pyramid_deformdeform_bootstrapcolanderpillowrepoze.filesaferepoze.folder

Page 34: What makes pyramid unique

setup.pyに依存ライブラリを追加する

install_requires = [..."pyramid_deform","deform_bootstrap","colander","pillow","repoze.filesafe","repoze.folder",

Page 35: What makes pyramid unique

iniファイルにアドオンを追加する

pyramid.includes = .... pyramid_deform deform_bootstrap

Page 36: What makes pyramid unique

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

Pyramidでの開発

ビューを書く

@view_config(context=Document, renderer='templates/document.pt')def document_view(request): return dict()

Page 38: What makes pyramid unique

テンプレートを書く

<html><body><h1>${context.__name__}</h1><div>${structure:context.contents}</div></body></html>

Page 39: What makes pyramid unique

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

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

pserveでWebアプリケーションを実行

pserve development.ini --reload

Page 42: What makes pyramid unique

ユーザー入力フォーム

スキーマ定義

class AddDocumentSchema(c.Schema): name = c.SchemaNode(c.String()) contents = c.SchemaNode(c.String(), widget=w.RichTextWidget())

Page 43: What makes pyramid unique

ユーザー入力(実装)

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

pyramid_deform (表示)

${structure:form}

Page 45: What makes pyramid unique

Chameleonのテンプレートマクロ(定義)

<html metal:define-macro="html"><head><!-- いろんなヘッダ -->

</head><body metal:define-slot="main"></body></html>

Page 46: What makes pyramid unique

Chameleonのテンプレートマクロ(利用)

<html metal:use-macro="base.macros.html"><body metal:fill-slot="main">${form}</body></html>

Page 47: What makes pyramid unique

まとめ

使う場合言われるほど面倒ではない難しいこともない

使い切る場合手をいれれられる箇所が多いので、相対的に難しく感じるかも?

Page 48: What makes pyramid unique

(´  > ω < )こわくないよー

Page 49: What makes pyramid unique

Pyramidの今後

Pyramidベースのフレームワークが発展していく

Python3対応?ああ、去年やってましたね。

テンプレートの標準サポートをなくす方針

Page 50: What makes pyramid unique

Pyramidの今後

管理アプリが欲しい!今世界中のPylonsどもが実装している。