Redashで使われているPythonモジュールメモ
Redashのコードを追うときに知っておくとよさそうなモジュールを個人的にメモ。
コミットIDは以下のもので調べたので。バージョン違いなどで差異があると思う。
依存関係を調べる
requirements.txt を読んでいってもいいけど、 pipdeptree が便利そうだったので使った。
$ pipdeptree
celery==3.1.23
- billiard [required: >=3.3.0.23,<3.4, installed: 3.3.0.23]
- kombu [required: <3.1,>=3.0.34, installed: 3.0.37]
- amqp [required: >=1.4.9,<2.0, installed: 1.4.9]
- anyjson [required: >=0.3.3, installed: 0.3.3]
- pytz [required: >dev, installed: 2016.7]
Flask-Admin==1.4.2
- Flask [required: >=0.7, installed: 0.11.1]
- click [required: >=2.0, installed: 6.6]
- itsdangerous [required: >=0.21, installed: 0.24]
- Jinja2 [required: >=2.4, installed: 2.8]
- MarkupSafe [required: Any, installed: 0.23]
- Werkzeug [required: >=0.7, installed: 0.11.11]
- wtforms [required: Any, installed: 2.1]
Flask-Limiter==0.9.3
- Flask [required: >=0.8, installed: 0.11.1]
- click [required: >=2.0, installed: 6.6]
- itsdangerous [required: >=0.21, installed: 0.24]
- Jinja2 [required: >=2.4, installed: 2.8]
- MarkupSafe [required: Any, installed: 0.23]
- Werkzeug [required: >=0.7, installed: 0.11.11]
- limits [required: Any, installed: 1.2.1]
- six [required: >=1.4.1, installed: 1.10.0]
- six [required: >=1.4.1, installed: 1.10.0]
Flask-Login==0.4.0
- Flask [required: Any, installed: 0.11.1]
- click [required: >=2.0, installed: 6.6]
- itsdangerous [required: >=0.21, installed: 0.24]
- Jinja2 [required: >=2.4, installed: 2.8]
- MarkupSafe [required: Any, installed: 0.23]
- Werkzeug [required: >=0.7, installed: 0.11.11]
Flask-Mail==0.9.1
- blinker [required: Any, installed: 1.3]
- Flask [required: Any, installed: 0.11.1]
- click [required: >=2.0, installed: 6.6]
- itsdangerous [required: >=0.21, installed: 0.24]
- Jinja2 [required: >=2.4, installed: 2.8]
- MarkupSafe [required: Any, installed: 0.23]
- Werkzeug [required: >=0.7, installed: 0.11.11]
Flask-Migrate==2.0.1
- alembic [required: >=0.6, installed: 0.9.6]
- Mako [required: Any, installed: 1.0.7]
- MarkupSafe [required: >=0.9.2, installed: 0.23]
- python-dateutil [required: Any, installed: 2.4.2]
- six [required: >=1.5, installed: 1.10.0]
- python-editor [required: >=0.3, installed: 1.0.3]
- SQLAlchemy [required: >=0.7.6, installed: 1.1.4]
- Flask [required: >=0.9, installed: 0.11.1]
- click [required: >=2.0, installed: 6.6]
- itsdangerous [required: >=0.21, installed: 0.24]
- Jinja2 [required: >=2.4, installed: 2.8]
- MarkupSafe [required: Any, installed: 0.23]
- Werkzeug [required: >=0.7, installed: 0.11.11]
- Flask-Script [required: >=0.6, installed: 2.0.6]
- Flask [required: Any, installed: 0.11.1]
- click [required: >=2.0, installed: 6.6]
- itsdangerous [required: >=0.21, installed: 0.24]
- Jinja2 [required: >=2.4, installed: 2.8]
- MarkupSafe [required: Any, installed: 0.23]
- Werkzeug [required: >=0.7, installed: 0.11.11]
- Flask-SQLAlchemy [required: >=1.0, installed: 2.1]
- Flask [required: >=0.10, installed: 0.11.1]
- click [required: >=2.0, installed: 6.6]
- itsdangerous [required: >=0.21, installed: 0.24]
- Jinja2 [required: >=2.4, installed: 2.8]
- MarkupSafe [required: Any, installed: 0.23]
- Werkzeug [required: >=0.7, installed: 0.11.11]
- SQLAlchemy [required: >=0.7, installed: 1.1.4]
Flask-OAuthlib==0.9.3
- Flask [required: Any, installed: 0.11.1]
- click [required: >=2.0, installed: 6.6]
- itsdangerous [required: >=0.21, installed: 0.24]
- Jinja2 [required: >=2.4, installed: 2.8]
- MarkupSafe [required: Any, installed: 0.23]
- Werkzeug [required: >=0.7, installed: 0.11.11]
- oauthlib [required: >=0.6.2, installed: 2.0.6]
- requests-oauthlib [required: >=0.5.0, installed: 0.8.0]
- oauthlib [required: >=0.6.2, installed: 2.0.6]
- requests [required: >=2.0.0, installed: 2.11.1]
Flask-RESTful==0.3.5
- aniso8601 [required: >=0.82, installed: 1.1.0]
- python-dateutil [required: Any, installed: 2.4.2]
- six [required: >=1.5, installed: 1.10.0]
- Flask [required: >=0.8, installed: 0.11.1]
- click [required: >=2.0, installed: 6.6]
- itsdangerous [required: >=0.21, installed: 0.24]
- Jinja2 [required: >=2.4, installed: 2.8]
- MarkupSafe [required: Any, installed: 0.23]
- Werkzeug [required: >=0.7, installed: 0.11.11]
- pytz [required: Any, installed: 2016.7]
- six [required: >=1.3.0, installed: 1.10.0]
Flask-SSLify==0.1.5
- Flask [required: Any, installed: 0.11.1]
- click [required: >=2.0, installed: 6.6]
- itsdangerous [required: >=0.21, installed: 0.24]
- Jinja2 [required: >=2.4, installed: 2.8]
- MarkupSafe [required: Any, installed: 0.23]
- Werkzeug [required: >=0.7, installed: 0.11.11]
funcy==1.7.1
gunicorn==19.7.1
honcho==0.5.0
httplib2==0.10.3
jsonschema==2.4.0
parsedatetime==2.1
passlib==1.6.2
pipdeptree==0.10.1
- pip [required: >=6.0.0, installed: 9.0.1]
psycopg2==2.7.3.2
pysaml2==2.4.0
- argparse [required: Any, installed: 1.1]
- decorator [required: Any, installed: 4.1.2]
- paste [required: Any, installed: 2.0.3]
- six [required: >=1.4.0, installed: 1.10.0]
- pycrypto [required: >=2.2, installed: 2.6.1]
- pyOpenSSL [required: Any, installed: 16.2.0]
- cryptography [required: >=1.3.4, installed: 2.0.2]
- asn1crypto [required: >=0.21.0, installed: 0.24.0]
- cffi [required: >=1.7, installed: 1.11.2]
- pycparser [required: Any, installed: 2.18]
- enum34 [required: Any, installed: 1.1.6]
- idna [required: >=2.1, installed: 2.6]
- ipaddress [required: Any, installed: 1.0.19]
- six [required: >=1.4.1, installed: 1.10.0]
- six [required: >=1.5.2, installed: 1.10.0]
- python-dateutil [required: Any, installed: 2.4.2]
- six [required: >=1.5, installed: 1.10.0]
- pytz [required: Any, installed: 2016.7]
- repoze.who [required: Any, installed: 2.3]
- setuptools [required: Any, installed: 38.2.5]
- WebOb [required: Any, installed: 1.7.4]
- zope.interface [required: Any, installed: 4.4.3]
- setuptools [required: Any, installed: 38.2.5]
- requests [required: >=1.0.0, installed: 2.11.1]
- zope.interface [required: Any, installed: 4.4.3]
- setuptools [required: Any, installed: 38.2.5]
pystache==0.5.4
raven==6.0.0
- contextlib2 [required: Any, installed: 0.5.5]
redis==2.10.5
RestrictedPython==3.6.0
- setuptools [required: Any, installed: 38.2.5]
semver==2.2.1
simplejson==3.10.0
sqlparse==0.1.8
statsd==2.1.2
wheel==0.24.0
XlsxWriter==0.9.3
(自分にとって)重要そうなモジュール
Flask
Webアプリケーションフレームワーク。Djangoと並んで有名なのでよく使われている印象。
Redashのサーバーサイドで使われている。
Jinja2
Redashのサーバーサイドのテンプレートエンジン。
Click
Flaskと同じ作者だったはず。
SQLAlchemy
DB周りのいろいろ+ORM。Redashでは以前Peeweeが使われていたけど今はこっち。
Alembic
DBマイグレーションツール。SQLAlchemyと作者が同じっぽい。
Gunicorn
WSGIに対応したアプリケーションサーバー。Flaskはこの上で動いている。
Celery
タスクキュー。RedashのクエリはすべてCelery上で動く。
pystache
MustacheのPython実装。Redashではクエリにパラメータを埋め込むときに使われている。
RestrictedPython
制限付きのPythonを実行するためのモジュール。Pythonデータソースで使われている。
まとめ
データソースに関わるもの以外では、だいたいこなれたモジュールが使われていて、コードを読もうとしたらそれなりに読めるしわかる。というのもRedashの良さの一つかもしれない。

- 作者: 池内孝啓,鈴木たかのり,石本敦夫,小坂健二郎,真嘉比愛
- 出版社/メーカー: 技術評論社
- 発売日: 2015/10/17
- メディア: 単行本(ソフトカバー)
- この商品を含むブログ (1件) を見る