Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.

Pyramidのrendererをカスタマイズする

PythonのWebアプリケーションフレームワークであるPyramidのrendererをカスタマイズする方法を考察します。1.4対応。

  • Login to see the comments

  • Be the first to like this

Pyramidのrendererをカスタマイズする

  1. 1. Rendererをカスタマイズす る @moriyoshit For Pylonsはっかそん 2014.11
  2. 2. 自己紹介 • Pylonsはっかそん初めてです • 仕事でPyramidを2年ほど…
  3. 3. 動機 • Requestによってレンダリングするテンプレートを変えた い • Virtual hostみたいなものを想定 • それたぶんpyramid_layoutでできるよ? • Exception viewはどうする? • Requestに含まれる情報からレンダリングに必要な情報を 作ってテンプレートに渡したい • たとえば、CSSや画像へのパスなど • これは BeforeRender event で inject してもいいけど、レンダリ ングの文脈でやりたい
  4. 4. add_view permission attr mapper http_cache Predicates request_type / request_method / request_param / xhr / containment / wrapper / accept / header / context / decorator / match_param / check_csrf / effective_principals / physical_path Pyramidのレンダリングのしくみ View Deriver RendererHelper route_name renderer Create Parameters Create (caller package) Parameters
  5. 5. Pyramidのレンダリングのしくみ Predicated view Auth debug view Secured view Wrapped view HTTP cached view Rendered view Mapped view User-supplied view callable View Deriver
  6. 6. Pyramidのレンダリングのしくみ class ViewDeriver(object): def __init__(self, **kw): self.kw = kw self.registry = kw['registry'] self.authn_policy = self.registry.queryUtility(IAuthenticationPolicy) self.authz_policy = self.registry.queryUtility(IAuthorizationPolicy) self.logger = self.registry.queryUtility(IDebugLogger) def __call__(self, view): return self.attr_wrapped_view( self.predicated_view( self.authdebug_view( self.secured_view( self.owrapped_view( self.http_cached_view( self.decorated_view( self.rendered_view( self.mapped_view( view)))))))))
  7. 7. Pyramidのレンダリングのしくみ Rendered view Mapped view User-supplied view callable RendererHelper IRendererFactory IRenderer Dict-like Lookup IResponse Create Passing self as IRenderInfo
  8. 8. add_viewでの挙動 if isinstance(renderer, string_types): renderer = renderers.RendererHelper( name=renderer, package=self.package, registry = self.registry) 渡されたrendererがstring typeであれば RendererHelperでくるむ そうでなければ、RendererHelperとしてそのまま ViewDeriverに渡す
  9. 9. カスタマイズポイント • IRenderFactoryを登録する (add_renderer) • レンダラのルックアップ方法に縛られる • 拡張子 • フルマッチ • カスタムレンダラにconfiguration時にパラメータを渡す術がな い • RendererHelperを直接add_viewのrendererとして渡す • RendererHelperのコンストラクタに渡すべきconfig.packageと config.registryは別途取得しておかないといけない • @view_config decorator と相性が悪すぎる
  10. 10. 結局どうしているか • ILateBoundRendererHelper というインターフェイスを 勝手に定義、コンストラクタでpackageとregistryを渡 すのではなくて後からvenusianのscan時にbindできる ようにした • bind(package, registry) • 上記のインターフェイスに対応したadd_viewとして add_lbr_viewというdirectiveを追加w • add_lbr_viewに対応した@lbr_view_configを作った

×