下町エンジニアの雑多ブログ

東京の端っこでITエンジニアやってます。テックブログを中心に書いていきたいと思います

Flask入門~公式ドキュメントを読み解く~ Day 2 ~

f:id:usktkt:20181019225022p:plain

前回の内容

前回の記事では、Anacondaのインストールと最初のFlaskアプリケーション作成を行いました。

今回からいよいよ、公式サイトのチュートリアルを進めていきます。*1

完成イメージ

チュートリアルでは、以下のようなブログアプリが作成できます。

f:id:usktkt:20181020213143p:plain
インデックス画面

f:id:usktkt:20181020213227p:plain
ログイン画面

f:id:usktkt:20181020213326p:plain
編集画面

アプリケーションのセットアップ

まずは、アプリケーションのセットアップを行います。Ubuntu上でhomeディレクトリに「flask-tutorial」というディレクトリを作り、その中で「fraskr」というディレクトリを作ります。そして、flaskrディレクトリの中に__init__.pyを作ります。

cd ~
mkdir flask-tutorial
cd flask-tutorial
mkdir flaskr
vi ./flaskr/__init__.py

すると、viで__init__.pyの編集画面に移るので、以下を入力してください。viでの編集が苦手な方は、ホストOS側でAtomVisual Studio Codeなどのエディタでファイルを作成し、CyberDuckのようなFTPクライアントを利用してファイルを転送する方法も可能です。

__init__.pyはflaskrの初期化処理として実行されるので、ここにFlaskインスタンスを生成するメソッドを記述します。また、__init__.pyが配置されたディレクトリは、パッケージとしてみなされるようになります。

import os
from flask import Flask

def create_app(test_config=None):
    # アプリケーションの生成と設定を行う
    app = Flask(__name__, instance_relative_config=True)
    app.config.from_mapping(
        SECRET_KEY='dev',
        DATABASE=os.path.join(app.instance_path, 'flaskr.sqlite'),
    )

    if test_config is None:
        # testではない場合に、インスタンスの設定値が存在すれば読み込む
        app.config.from_pyfile('config.py', silent=True)
    else:
        # テストの設定を読み込む
        app.config.from_mapping(test_config)

    # instanceフォルダが存在することを保証する
    try:
        os.makedirs(app.instance_path)
    except OSError:
        pass

    # helloを返すシンプルなページ
    @app.route('/hello')
    def hello():
        return 'Hello, World!'

    return app

以下、公式サイトの説明を翻訳していきます。直訳で分かりづらい箇所については適宜意訳しています。

  1. app = Flask(__name__, instance_relative_config=True) はFlaskインスタンスを生成する
    • __name__は現在のPythonモジュール名が格納される。アプリケーションは自分が置かれたパスを知る必要があるが、__name__によってそれを知ることができる。
    • instance_relative_config=Trueは、設定ファイルがinstanceフォルダに関連づけられていることを示す。 app.instance_pathはflaskrパッケージの外に配置され、秘密の設定値やデータベースファイルなどのバージョン管理しないローカルデータを保持しておくことができる。
  2. app.config.from_mapping() はアプリケーションが使用するデフォルト設定をセットする:
    • SECRET_KEYはFlaskや拡張機能でデータを安全に扱うために使用される。 ここでは開発用に 'dev'に設定されていますが、デプロイ時にはランダムな値で上書きする必要がある。
    • DATABASEは、SQLiteデータベースファイルが保存されるパスである。それはapp.instanceフォルダの配下にあります。データベースの詳細については次のセクションで学習します。
  3. app.config.from_pyfile()はinstanceフォルダにconfig.pyが存在すれば、デフォルト設定値をそこから得られる値で上書きする。例えば、デプロイの際に実際のSECRET_KEYに置き換えることができる。
    • test_configもアプリケーションに渡すことができ、インスタンスの設定値の代わりに使うことができる。これは、チュートリアルの後半で説明するテストで、開発時の設定値とは別の設定値を使用できるようにするためのものである。
  4. os.makedirs()はapp.instance_path が存在することを保証する。(instanceディレクトリ作成をtryし、ディレクトリが存在しない場合は作成、既に存在している場合は例外が発生しpassされる)
  5. @app.route()はシンプルなルートを生成し、残りのチュートリアルに進む前に動作確認をすることができる。 ここでは、URL/hello と関数を結びつけ、'Hello, World!' という文字列を返す。

ではここで、一度実行してみます。

export FLASK_APP=flaskr    # flaskrアプリケーションを指定する
export FLASK_ENV=development    # developmentモードで実行することを指定する
flask run --host=0.0.0.0    # ホストOSから確認したいので--host=0.0.0.0をつける

developmentモードで実行しておくと、例外が発生した場合に対話型のデバッガーを表示したり、コードを修正した場合に自動でサーバを再起動してくれるなどのメリットがあります。

ここまで出来たら、ホストOSのブラウザからhttp://192.168.33.10:5000/hello にアクセスしてみましょう。Hello, Worldと表示されれば成功となります。

まとめ

今回はチュートリアルの完成イメージの確認と、アプリケーションのセットアップを行いました。

次回はデータベースを作成していきます。

内容について、質問・指摘があればコメントよろしくお願いします。