wheezy.webいいかもー(1)

wheezy.webという新しいフルスタック軽量WebFrameworkがリリースされています。 モダンな作りでかつ役割分担を明確に分離してデザインされています。 コードがシンプルで、アプリの実装に対して 極力オーバーヘッドにならないよう注意深く実装されています。 「契約によるデザイン」やベンチマークテストも取り入れていて 多人数での開発でも耐えうる仕掛けを持っているようです。

フレームワークのポリシー

  • 薄く広くサポート
  • Model/View/Controller分離推奨
  • WSGIサーバ用意してない。好きなの使え。
  • DBエンジンは用意してない。好きなの使え。
  • テンプレートエンジンは推奨のを用意してるが必須じゃない。好きなのを使え。

特徴

  • フルスタック
  • 裏でややこしいトリックが動いていない
  • DesignByContractをサポート
  • 他のモジュールへのハード依存がほとんどない。
  • 役割ごとにパッケージ・モジュールが細かく分割。
  • 自パッケージ間の依存もかなり少ない。
  • Python3.xフルサポート
  • コードをPython2.xとの共用を支援するツールもある
  • データモデルはピュアobject
  • SQLAlchemyだろうがpeeweeだろうがredisでも繋がる。
  • ただしDB-モデル間のマッピングは書き手の作業。
  • テンプレートエンジン?一応標準のあるけど好きなの使え。
  • クラスハンドラー/関数ハンドラー書き方を選べる
  • 階層キャッシュサポート
  • CSRF対策あり
  • DesignByContract支援機能
  • エラーハンドリングミドルウェア
  • ルーティングミドルウェア
  • JSONレスポンス/テンプレートレンダリングレスポンス
  • バリデーションツールセット
  • フォームWidgetレンダラ
  • 継承可能な高速テンプレートエンジン
  • i18nサポート&ミドルウェア
  • Principal(authenticate)
  • Role(authorization)

機能一覧

以下の10個のパッケージに分かれています。

wheezy.web 0.1.340
A lightweight, high performance, high concurrency WSGI web framework with the key features to build modern, efficient web 本体
wheezy.core 0.1.101
A lightweight core library ユーティリティ関係
wheezy.http 0.1.262
A lightweight http request-response library HTTP処理
wheezy.html 0.1.125
A lightweight html rendering library HTMLジェネレータ
wheezy.caching 0.1.83
A lightweight caching library キャッシングミドルウェア
wheezy.routing 0.1.145
A lightweight path routing library ルーティングミドルウェア
wheezy.security 0.1.46
A lightweight security/cryptography library 暗号化サポートや認証の仕組み
wheezy.validation 0.1.84
A lightweight object validation library バリデーションツールセット
wheezy.captcha 0.1.25
A lightweight captcha library PIL依存のキャプチャライブラリ
wheezy.template 0.1.132
A lightweight template library テンプレートエンジン

最後の下2つはオプショナルです。また、それぞれ詳細なドキュメントが分離してるので wheezy.webのドキュメントで不足を感じたら詳細ドキュメントを参照しましょう。

インストール

以下の2つをインストールすることでフルスタックになる。

  • pip-3.3 install wheezy.web wheezy.template

テンプレートは好みのものにしてもイイ。

契約デザイン

以下のようなインターフェースクラスを定義。

class IRepository(object):
    def method(self, locale):
        return {}
from wheezy.core.introspection import looks
assert looks(Repository).like(IRepository)

という様にすると、RepositoryクラスがIRepositoryと インターフェースに互換性が在るかどうかをチェックできる。

「ドライバー部分を幾つかを用意してすげ替えて利用する」 といった要件がでたらインターフェースを定義しましょう。

wheezy.templateについて

このエンジンが必須ではありません。JinjaもMakoもつかえる仕組み。 wheezyらしく固めの特徴として「要求宣言」があります。

機能は少なめだが、ベンチマークではかなり早い部類になってる。

  • 要求宣言
  • 継承
  • 制御構造(繰り返し/分岐/マクロ)
  • インライン取り込み
要求宣言について:
「@require(a,b,c)」とするとテンプレートのコンテキストにa,b,cが無いとエラーになる

これのおかげで細分化したテンプレートを再利用しやすくなってる。

役割の分割構成

  • content/static/: スタティックリソース
  • content/templates/: テンプレートリソース
  • models.py: モデル(エンティティの定義)
  • repository.py: モデルとストレージの橋渡し。ビジネスロジックを記述。(コントローラ)
  • views.py: repositoryを参照・操作してプレゼンテーション層に引き渡す(モデルアクセス禁止)
  • urls.py: URIとビューハンドラをマップ
  • config.py: サイトグローバルなオプションやDBセッションオブジェクトファクトリを入れる。

スタティックファイルのサーブ

from wheezy.web.handlers import file_handler
static_file = file_handler(root='content/static/', age=timedelta(hours=1))

static_fileをurlsでマップ。 上記の例の場合1時間キャッシュが生きているなら304を返す。

endpointをURIに変換するには

path_forというマクロが定義されている。

@require(path_for)

<a href="@path_for(endpoint_name)">hoge</a>

というようにするとURIが展開されます。

キャッシュヒエラキー

キャッシュヒエラキーを組むことができ、 枝葉の更新が掛かると根に至るまでが連鎖的に更新フラグが立てられます。 更新フラグの付いたendpointは次のアクセス時にキャッシュがクリアされます。

ちょっとテスト中・・・。

まとめ

  • Python3を視野に入れてるならなおオススメ。
  • ソースはたくさん役割ごとに分かれていて探しやすい。
  • ソースの分量もこれ以上削れと言われても難しいくらいミニマム。
  • フォーム、ウィジェット、バリデータがバンドルというのもイイ。
  • テンプレートの@requireやDbCは多人数開発で威力を発揮するでしょう。
  • かといって実験的なミニWebアプリを書くのにも十分使えます。
  • リポジトリのサンプルはミニマムとラージがあるがミディアムが欲しい。

いまはミディアムなサンプルを構築中・・・。