What makes pyramid unique

4,440 views
4,348 views

Published on

What makes pyramid unique

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

×