0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

BlueprintでFlaskアプリケーションを分割する

Last updated at Posted at 2022-12-11

Flaskでwebアプリケーションを作成していて機能が増えてくると、一つのapp.pyに記述するプログラムが長大になり、メンテナンス性が落ちてくるので、Blueprintというモジュールを使ってアプリケーションを分割します。

今回はCRUD(Create,Read,Update,Delete)の4つの機能に分かれたFlaskアプリケーションを例に、Blueprintを使ってアプリケーションを分割してみます。

ディレクトリ構成

Blueprintを使う際のディレクトリ構成は、こんな感じです。
directory.png

「Create」「Read」「Update」「Delete」それぞれのディレクトリがあり、その中にそれぞれの機能を記載するviews.pyファイルと、実際にレンダリングされるhtmlファイルがtemplatesディレクトリの中に入っているのがポイントです。

それら全ての機能がapp.pyに集約されてくる、というイメージです。
では、初めにapp.pyファイルから書いていきます。

app.pyのプログラム

app.py
from flask import Flask

def create_app():
    app = Flask(__name__)

    #createページ
    from create import views as create_views
    app.register_blueprint(create_views.create, url_prefix="/create")

    # その他のページも同様にimport
    return app

app.pyの中でcreate_app関数を作成し、その中で各ディレクトリからインスタンスをimportしてきます。
importしてきたインスタンスをBlueprintのregister_blueprintメソッドによってappに登録します。
(この時点では、各ディレクトリのviews.pyファイルもtemplatesも作成していないので、flask runしてもエラーになります。)

次に、それぞれのディレクトリのviews.pyファイルを作成します。

各ディレクトリの「views.py」を作成

最初に、createディレクトリのviews.pyを作成します。

create/views.py
from flask import Blueprint, render_template

create = Blueprint(
    "create",
    __name__,
    template_folder="templates",
)

@create.route("/")
def index():
    # createルートの機能を記載
    return render_template("create/index.html")

Blueprintモジュールをimportし、createという名前でBlueprintクラスをインスタンス化します。(このインスタンスが先程app.pyでimportしているインスタンスです。)

さらに、/createルートでそれぞれの機能を実装し、ブラウザ上にレンダリングされるhtmlファイルをrender_template関数で指定します。

htmlファイルの作成

続いて、/createルートでレンダリングされるhtmlファイルを/create/templates/create/index.htmlファイルとして作成します。

ここで注意しなければならないのが、templatesディレクトリ配下にcreateディレクトリを一度挟むという点です。
(まどろっこしいのですが、こうしないとflaskが正しくパスを認識できずhtmlファイルがレンダリングされません・・・)

/create/templates/create/index.html
<!DOCTYPE html>
<html lang="ja">
    <head>
        <meta charset="utf-8">
        <title>Create</title>
        <link rel="stylesheet" href="{{ url_for('static',filename='style.css') }}">
    </head>
    <body>
        <h1>Create</h1>
    </body>
</html>

CSSでデザインを当てたい場合は、static/css/style.cssファイルにスタイルを記述し、
<link rel="stylesheet" href="{{ url_for('static',filename='style.css') }}">
で読み込みます。

この状態でflask runしてアプリケーションを起動し、ブラウザで
http://127.0.0.1:5000/create/
にアクセスすると、createページがレンダリングされます。

基本的な流れは以上です。
残りのread,update,deleteページも同様にviews.pyindex.htmlファイルを編集していきます。

read/views.py
from flask import Blueprint, render_template

read = Blueprint(
    "read",
    __name__,
    template_folder="templates",
)

@read.route("/")
def index():
    # createルートの機能を記載
    return render_template("read/index.html")
/read/templates/read/index.html
<!DOCTYPE html>
<html lang="ja">
    <head>
        <meta charset="utf-8">
        <title>Read</title>
        <link rel="stylesheet" href="{{ url_for('static',filename='style.css') }}">
    </head>
    <body>
        <h1>Read</h1>
    </body>
</html>
app.py
#以下を追加
#readページ
    from read import views as read_views
    app.register_blueprint(read_views.read, url_prefix="/read")
#その他のページも同様に

すべてのページを登録したら、flask runして

http://127.0.0.1:5000/read/
http://127.0.0.1:5000/update/
http://127.0.0.1:5000/delete/

それぞれのページが表示されれば、Blueprintでの分割完了です。

0
0
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
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?