Flaskでは、環境変数FLASK_APPに起動スクリプトを登録すると、下記のようなflaskコマンドを使えます。
my_flask_app/
├── app/
│ ├── __init__.py <=
これを置くことにより、app.パッケージとして呼び出せる
│ ├── routes.py
│ ├── models.py
│ └── ...
├── venv/
├── .env (.env.*)
├── config.py
└── run.py <= 起動ファイルを分ける場合
run.py:
from app import create_app
app = create_app()
if __name__ == '__main__':
app.run()
app.__init__.py:
from flask import Flask
def create_app():
app = Flask(__name__)
# コンフィグの読み込み
app.config.from_object('config.Config')
# ブループリントの登録
from .routes import main as main_blueprint
app.register_blueprint(main_blueprint)
return app
config.py:
import os
class Config:
SECRET_KEY = os.getenv('SECRET_KEY') or 'default_secret_key'
SQLALCHEMY_TRACK_MODIFICATIONS = False
class DevelopmentConfig(Config):
SQLALCHEMY_DATABASE_URI = os.getenv('DEV_DATABASE_URI') or 'sqlite:///dev.db'
DEBUG = True
class TestingConfig(Config):
SQLALCHEMY_DATABASE_URI = os.getenv('TEST_DATABASE_URI') or 'sqlite:///test.db'
TESTING = True
class ProductionConfig(Config):
SQLALCHEMY_DATABASE_URI = os.getenv('DATABASE_URI') or 'sqlite:///prod.db'
DEBUG = False
TESTING = False
config = {
'development': DevelopmentConfig,
'testing': TestingConfig,
'production': ProductionConfig,
'default': DevelopmentConfig
}
.env:
FLASK_APP=app.py
FLASK_ENV=development
SECRET_KEY=your_secret_key
SQLALCHEMY_DATABASE_URI=sqlite:///site.db
MAIL_SERVER=smtp.example.com
MAIL_PORT=587
MAIL_USE_TLS=True
MAIL_USERNAME=your-email@example.com
MAIL_PASSWORD=your-email-password
.env.developtment:
FLASK_ENV=development
SECRET_KEY=dev_secret_key
DEV_DATABASE_URI=sqlite:///dev.d
.env.testing:
FLASK_ENV=testing
SECRET_KEY=test_secret_key
TEST_DATABASE_URI=sqlite:///test.db
.env.production:
FLASK_ENV=production
SECRET_KEY=prod_secret_key
DATABASE_URI=sqlite:///prod.db
app.py:
import os
from flask import Flask
from dotenv import load_dotenv
from config import config
# .envファイルの読み込み
load_dotenv()
app = Flask(__name__)
env = os.getenv('FLASK_ENV') or 'default'
app.config.from_object(config[env])
# 続く
export FLASK_ENV=development
flask run
app.wsgi:
import os
from app import create_app
os.environ['FLASK_APP'] = 'run.py'
os.environ['FLASK_ENV'] = 'production'
app = create_app()
httpd.conf:
<VirtualHost *:80>
ServerName yourdomain.com
WSGIDaemonProcess my_flask_app threads=5
WSGIScriptAlias / /path/to/your/project/wsgi.py
<Directory /path/to/your/project>
Require all granted
</Directory>
Alias /static /path/to/your/project/app/static
<Directory /path/to/your/project/app/static>
Require all granted
</Directory>
ErrorLog ${APACHE_LOG_DIR}/error.log
CustomLog ${APACHE_LOG_DIR}/access.log combined
</VirtualHost>
環境変数:
FLASK_APP: アプリケーションのエントリーポイントを指定
FLASK_ENV: 実行環境を指定
FLASK_DEBUG: デバッグモード(例:FLASK_DEBUG=1)。
flask run
--host: ホスト(デフォルトは127.0.0.1)。
--port: ポート番号 (デフォルトは5000)。
--debug: デバッグモード
開発サーバーを実行し、Flaskアプリケーションにブラウザでアクセス可能になる
flask shell
Flaskアプリケーションコンテキスト内でPythonシェルを起動
flask routes
アプリケーションのすべてのルートを一覧表示
flask db
flask db init: マイグレーションディレクトリを初期化
flask db migrate: 新しいマイグレーションを作成し
flask db upgrade:
データベースを最新のマイグレーションにアップグレード
データベースのマイグレーション操作。Flask-Migrate拡張機能と連携して使う
flask test
Flaskアプリケーションのテストを実行
Flaskコマンドのカスタマイズ
app.pyで@app.cli.commandを使うと使えるようになります。
以下の例では flask hello コマンドが使えるようになります。
app.py:
import click
from flask import Flask
app = Flask(__name__)
@app.cli.command("hello")
def hello():
click.echo("Hello, Flask!")