LoginSignup
1
5

More than 3 years have passed since last update.

FlaskでWebサービスを作るときのメモ・参考集

Last updated at Posted at 2020-04-22

WIP

はじめに

Flaskを使ってWebサーバーを書くことが多いので、よく参考にするページをまとめておきます。
とりあえずはリンク集になるかと思いますが、時間があれば内容も書き足して行きたいです。
(そろそろFastAPIつかってみたい)

主な環境

  • Python 3.8 (pipenv, pyenv)
  • Flask
  • MySQL 8.0 - SQLAlchemy
  • gunicorn
  • Nginx
  • (Docker, docker-compose)
  • Ubuntu 20.04 LTS

Flaskまわり

  • SECRET_KEYについて
    公式チュートリアルには、os.urandom(12)を用いるのが良いとされているが、これはアンチパターン
    gunicornを複数のWorkderで動かしたときに、workerによって異なるSECRET_KEYが設定されてしまうため、SessionやCSRFProtection(Flask-WTF)が正常に動かない

  • 便利な拡張集

  • socket.io

session

ブラウザセッション

プラグインを何も入れていないバニラのFlaskでは
* cookie session
* base64encode
となっている。
公式Docにはapp.ConfigSecretKeyを設定する旨が記載されているが、これはsessionに格納された内容の改竄を防ぐためのhash計算にこのキーを用いているだけであり、sessionの中身自体が暗号化されるわけではない。

server session

プラグインを導入する必要がある。sessionを保存するバックエンドの選択肢としては、Redis, その他NoSQL, FileSystem, SQL等がある

有名所のプラグインとしては

などがある。FLask-Sessionは、Sessionを保持するバックエンドに対してFlask内からアクセスするが、Beakerは使用するWSGI(例えばGunicorn)のミドルウェアとして動作する。
また後者はCache機能も提供する。
なお、Flask-Sessionは、バックエンドにSQLAlchemyを指定した場合(つまりSQL)正しく動作しないバグが確認されている。(2020.5月時点)

logging

Flaskやそのプラグインは、ログ出力機能が提供されていることが多い。出力されているログをFlask本体のログハンドルで捉えて出力させるには、

import logging
from flask.logging import default_handler #flask本体のログハンドラ
# その他のimportなど
from flask_cors import CORS

def create_app():
    # init_app等の諸々の処理
    # ここでは、ログを取りたいプラグインを`flask_cors`とする
    cors_err_lggr = logger.getLogger('flask_cors')
    # 大体のプラグインは内蔵loggerの名前を__name__で指定している?
    cors_err_lggr.setLever(logging.DEBUG)
    # デフォルトのログハンドラを追加
    cors_err_lggr.addHandler(default_handler)

    # その他諸々の処理

    return app

test

DB(MySQL, SQLAlchemy)まわり

many:manyの中間テーブルに、独立したカラム(ForeignKeyでないカラム)を設定する場合、relationを用いるよりも、association_proxyを使ったほうが良い。
association_proxyに関する公式Doc、実装例付き

Nginx, Gunicornまわり

Dockerまわり

デプロイまわり

  • Fabric2がいいらしい?

公式ドキュメント
CapistranoとかDeployerみたいな感じ
解説記事1
解説記事2

おわりに

いや、FastAPI良くないか?

1
5
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
5