Flask でアプリケーションを作る際のメモ

自分用のメモ。
Flask はマイクロフレームワークを詠っているが、大きめのアプリケーションを作る事が出来る。
自分で色々組み合わせて行くのが好きなので Flask を使う。
メンドクサイのなら、素直に Django とか Pyramid なフルスタックを使えば良い。


Modular Applications with Blueprints — Flask 1.0.2 documentation
Flask で大きなアプリケーション Blueprint ver. - 混沌脳内

アプリケーションの構成

お手本としたアプリケーション*1
danjac / newsmeme — Bitbucket
http://www.ninxit.com/blog/2011/03/09/flask-mvc-sample/
基本的に上記に影響を受けてる。

├── manage.py
└── app
    ├── __init__.py
    ├── configs
    ├── forms
    ├── i18n
    ├── models
    │          ├── __init__.py
    │          ├── meta.py
    │          ├── mappers
    │          └── tables
    ├── plugins
    ├── static
    ├── templates
    ├── tests
    ├── utils
    └── views
                ├── __init__.py
                ├── frontend
                └── admin

manage.py は Flask-Actions — Flask-Actions 0.6.4 documentation もしくは Flask-Script documentation has moved... を使用。

データベース

SQLAlchemy をそのまま使う。もしくは Flask-SQLAlchemy を使う。
自分は SQLAlchemy をそのまま使ってる。

JSON

SQLAlchemy のオブジェクトを JSON 化する場合は、Bitbucket | The Git solution for professional teams を使うと便利。

フォーム

シンプルな事しか出来ないが自分には事足りるので WTForms のエクステンションの Flask-WTF — Flask-WTF 0.9.1 documentation を使う。
CSRF のバリデーションも出来るので、エクステンションを使う。
Complex Validation with Flask-WTF | Flask (A Python Microframework)


複雑な事をしようとすると https://docs.pylonsproject.org/projects/deform/dev/ の方が良いのかもしれないけど未調査。
Form libraries

テスト

view のテストは Flask に付いてる テストクライアントを使用。
ロジック部分は unittest を使用。
テストランナーはNote to Users — nose 1.3.7 documentation を使用。

ログ

ログを出しておかないと椅子が飛んでくるそうなので…。
Flask に組み込んであるログを使えばよい。
設定ファイルからの読み込み、ハンドラーの設定等は danjac / newsmeme / source / newsmeme / application.py — Bitbucket を参考にした。

RESTful

PUT や DELETE は WEB ブラウザから使用できないので、ミドルウェアを使用する。
Overriding HTTP Methods for old browsers | Flask (A Python Microframework)

Pagination

Simple Pagination | Flask (A Python Microframework)
Flask-SQLAlchemy を使用するのなら上記が内包されている。

HTTP サーバ&WSGI サーバ

nginx + Gunicorn - Python WSGI HTTP Server for UNIX & http://meinheld.org/ のコンビ。

デーモン

Supervisor: A Process Control System — Supervisor 3.3.5 documentation を使用


思い出したら追記していく。

*1:Flask の最新版だと Module を使ってるので警告がでる