Section: 8 Scaling Applications

f:id:yukking3:20180504234809p:plain 現時点では、全てのコードをrun.pyに書いている。ここからはFlaskBlueprintを使って、たくさんのブロック作って整理してコードを作る。かっこよく言うとRoot Package


最初にhello flask projectをやってみる!


flask blueprint とは? アプリケーションをレジスターして、大きなプロジェクトを整理するための方法。


スケーリング appの配下に init.pyを設置する。ここでは自動でconfigにデータを取りに行くようにblueprintをregisterする。 今回の場合だと、

configuration = os.path.join(os.getcwd(), 'config', config_type + '.py')
#C:\\Users\\dell\\PycharmProjects\\book_catalog\\config\\dev.py

このコードを書くことで、# dev, test, or prodのファイルを自動で読み取りに行くことが出来る。 Configlationはデータベースという意味。つまり、データベースに接続される。


動作の流れまとめ

Init主な役割は2つあります
A. pythonスクリプトがあるディレクトリを表す役割
B. 必要なモジュールをimportするなどの初期化処理を記載し,初期化の役割を担う役目があります.

├── app
│   ├── __init__.py
│   ├── __pycache__
│   │   └── __init__.cpython-36.pyc
│   ├── auth
│   │   ├── __init__.py
│   │   └── __pycache__
│   │       └── __init__.cpython-36.pyc
│   └── catalog
│       ├── __init__.py
│       ├── __pycache__
│       │   ├── __init__.cpython-36.pyc
│       │   └── routes.cpython-36.pyc
│       ├── models.py
│       ├── routes.py
│       └── templates
├── config
│   ├── dev.py
│   ├── prod.py
│   └── test.py
└── run.py

①run.pyファイルでサーバーを立上げる。
②flask_app = create_app('prod') → configフォルダーのprod.pyでデータベース接続する
③flask_app.run() でapp起動する。 →appの配下のinit.pyが動く

from app import create_app, db
from app.auth.models import User
from sqlalchemy import exc

flask_app = create_app('prod')
with flask_app.app_context():
    db.create_all()
    try:
        if not User.query.filter_by(user_name='harry').first():
            User.create_user(user='harry', email='harry@potters.com', password='secret')
    except exc.IntegrityError:
            flask_app.run()

④appの配下のinit.pyが動く
これあってる? 次の順で、init→import→各アプリのinitが動く→mainを作る→app/iniに登録されているblueprint が出来る init.pyファイルにblue printが登録されている。それが発動する?

# app/__init__.py
import os
from flask import Flask
from flask_sqlalchemy import SQLAlchemy
from flask_bootstrap import Bootstrap
from flask_login import LoginManager
from flask_bcrypt import Bcrypt
from flask_heroku import Heroku

db = SQLAlchemy()
bootstrap = Bootstrap()
login_manager = LoginManager()
login_manager.login_view = 'authentication.do_the_login'
login_manager.session_protection = 'strong'
bcrypt = Bcrypt()
heroku = Heroku()


def create_app(config_type):  # dev, test, or prod

    app = Flask(__name__)
    configuration = os.path.join(os.getcwd(), 'config', config_type + '.py')
    # C:\\Users\\dell\\PycharmProjects\\book_catalog\\config\\dev.py
    app.config.from_pyfile(configuration)
    db.init_app(app)  # initialize database
    bootstrap.init_app(app)  # initialize bootstrap
    login_manager.init_app(app)  # initialize login_manager
    bcrypt.init_app(app)
    heroku.init_app(app)

    from app.catalog import main  # import blueprint
    app.register_blueprint(main)  # register blueprint

    from app.auth import authentication
    app.register_blueprint(authentication)

    return app

ここからは各アプリのinit.pyが動いてからの流れ

①catalogフォルダー配下にinit.pyファイルが動く。
init.pyファイルにblue printが登録されている。それが発動。initは3行のみ。
*from app.catalog import routesが発動される。

# app/catalog/__init__.py
from flask import Blueprint
main = Blueprint('main', __name__, template_folder='templates')

from app.catalog import routes

③route.pyファイルを読み込みにいく。
以下の通りroute.pyにはqueryが書かれていて、データベースから情報の抜き取り処理を行う。

@main.route('/')
def display_books():
    books = Book.query.all()
    return render_template('home.html', books=books)


@main.route('/display/publisher/<publisher_id>')
def display_publisher(publisher_id):
    publisher = Publication.query.filter_by(id=publisher_id).first()
    publisher_books = Book.query.filter_by(pub_id=publisher.id).all()
    return render_template('publisher.html',
                           publisher=publisher,
                           publisher_books=publisher_books)

④route.pyでデータ取得して、 return render_templateでhtmlに表示

@main.route('/')
def display_books():
    books = Book.query.all()
    return render_template('home.html', books=books)


run→サーバー起動→app/initで大枠の起動→catalog/initでアプリ起動→routeでデータ取得→htmlの順で動く。

app auth catalogフォルダーを順に作る。 配下にinit.pyを作る。 最後にconfigフォルダーを作る。 そこに3つのファイルを入れる。 dev.py, test.py, prod.pyを作る。

blueprintはクラスであり、クラスをつかうにはインスタンスがいる。mainというインスタンスを作る。

#app/catalog/__init__.py

main = Blueprint('main', __name__, template_folder='templates')

configフォルダーのdev.pyには、run.pyのapp.config.updateをそのまま入れる。f:id:yukking3:20180621215357p:plain

app/init.pyの設定を行う。 configration factoryと呼ばれる。このコードを書くことで、# dev, test, or prodのファイルを自動で読み取りに行くことが出来る。 Configlationはデータベースという意味。つまり、データベースに接続される。しかも、アプリ内全体で使えるconfigになる。

catalogフォルダー route.pyを作る。 f:id:yukking3:20180621221212p:plain route.pyがinit.pyのmainインスタンスを取りに行って、@main.route('/')ができる。 そして、init.pyがfrom app.catalog import routesでroteをインポートして起動する。

run.pyを作る。ターミナルでpython run.pyでサーバーが起動する。 f:id:yukking3:20180621222235p:plain