見出し画像

Flask Web Development P75~85 Summary 2

アプリケーションファクトリー

前回まで、hello.pyのファイルだけでアプリケーションを作成していましたが、実際にWebアプリケーションを作成する際には、config.pyでdatabaseをテスト用、開発用、本番用と分けた通り、異なるセッティングでアプリケーションを実行する必要があります。
そんなときには、複数のインスタンスを作成することができるファクトリー関数(create_app())を作成します。
appフォルダの中に作成しましょう。

③__init__.pyはこんな感じ。

from flask import Flask, render_template
from flask_bootstrap import Bootstrap
from flask_mail import Mail
from flask_moment import Moment
from flask_sqlalchemy import SQLAlchemy
from config import config

bootstrap = Bootstrap()
mail = Mail()
moment = Moment()
db = SQLAlchemy()


def create_app(config_name): # factory function
   app = Flask(__name__) 
   app.config.from_object(config[config_name]) # configuration settings are imported directly from config.py
   config[config_name].init_app(app) # configurations are initialized by init_app()

   bootstrap.init_app(app)
   mail.init_app(app)
   moment.init_app(app)
   db.init_app(app)

   #attach routes and custom error pages here is next section topic

   from .main import main as main_blueprint
   app.register_blueprint(main_blueprint)

   return app

ここで登場したBlueprintとは、Flaskの中で使われるモジュールで、それぞれのページのroute(アプリ)を分割することができ、プログラムの保守性を向上させることができるライブラリのことです。

create_app()についての参考ページ

④Blueprintを使用する際には、app/mainフォルダの中に以下の様な__init__.pyを作成しましょう。

from flask import Blueprint

main = Blueprint('main', __name__)

from . import views, errors

blueprintの__init__.pyをmainのフォルダに作成したので、route先となるforms.py、views.pyとerrors.pyを同フォルダ内に作成します。

⑤froms.pyを作りましょう。
こんな感じ

from flask_wtf import Form
from wtforms import StringField, SubmitField
from wtforms.validators import DataRequired

class NameForm(Form):
   name = StringField('What is your name?', validators=[DataRequired()])
   submit = SubmitField('Submit')

・Flask Web DevelpmentではRequiredを紹介されていますが、requireも使えるのですが、公式ページにもDataRequiredとなっていました。

⑥views.pyはこんな感じ

from datetime import datetime
from flask import render_template, session, redirect, url_for
from . import main
from .forms import NameForm
from .. import db
from ..models import User


@main.route('/', methods=['GET', 'POST'])
def index():
   form = NameForm()
   if form.validate_on_submit():
       user = User.query.filter_by(username=form.name.data).first()
       if user is None:
           user = User(username=form.name.data)
           db.session.add(user)
           db.session.commit()
           session['known'] = False
       else:
           session['known'] = True
           session['name'] = form.name.data
           form.name.data = ''
           return redirect(url_for('.index'))
   return render_template('index.html',
                          form=form, name=session.get('name'),
                          known=session.get('known', False),
                          current_time=datetime.utcnow())

・routeがblueprintによって与えられているので、@app.routeから@main.routeに変更されています。
・if app.config['FLASKY_ADMIN']:が抜けている点に注意してください。

⑦errors.pyはこんな感じ

from flask import render_template
from . import main


@main.app_errorhandler(404)
def page_not_found(e):
   return render_template('404.html'), 404

"""
@main.app_errorhandler(500)
def intrenal_server_error(e):
   return render_template('500.html'), 500
"""

・routeがblueprintによって与えられているので、@app.errorhandlerから@main.app_errorhandlerに変更されています。
・500.htmlは未作成なので、コードをコメントアウトしています

つづく...







この記事が気に入ったらサポートをしてみませんか?