Section: 8 Scaling Applications
現時点では、全てのコードを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をそのまま入れる。
app/init.pyの設定を行う。 configration factoryと呼ばれる。このコードを書くことで、# dev, test, or prodのファイルを自動で読み取りに行くことが出来る。 Configlationはデータベースという意味。つまり、データベースに接続される。しかも、アプリ内全体で使えるconfigになる。
catalogフォルダー route.pyを作る。 route.pyがinit.pyのmainインスタンスを取りに行って、@main.route('/')ができる。 そして、init.pyがfrom app.catalog import routesでroteをインポートして起動する。
run.pyを作る。ターミナルでpython run.pyでサーバーが起動する。