#TL;DL
Udemyの下記講座の受講記録
Python+FlaskでのWebアプリケーション開発講座!!~0からFlaskをマスターしてSNSを作成する~
https://www.udemy.com/course/flaskpythonweb/
この記事ではFlaskのBluePrintによるアプリケーション管理とbcryptによるパスワードの暗号化について記載する。
##BluePrintとは
作成したアプリケーションを機能などの単位別にグループ分けして管理したい場合に利用する機能。
例えば、個人情報管理機能(site1)とデータ照会機能(site2)のモジュールを別々に管理したい場合に、BluePrintを使用して分割管理することで、アプリケーションとしての見た目は1つでも、内部管理的には複数のアプリケーションとして分割管理することが可能となる。
構文
1.管理したいアプリケーションをBluePrintオブジェクトとして作成する。
フォーマット | サンプル | 作成されるURL例 |
---|---|---|
BluePrint(サイトの名称, __name__, url_prefix='/urlとして利用する文字列') | mysite1_bp = Blueprint('mysite1', name, url_prefix='/site1') | http://www.xxxx/site1/hello |
from flask import Blueprint, render_template
'''BlurPrintインスタンスの作成'''
mysite1_bp = Blueprint('mysite1', __name__, url_prefix='/site1')
@mysite1_bp.route('/hello')
def hello():
return render_template('mysite1/hello.html')
2.init.py でアプリケーションにBluePrintオブジェクトを登録する。
from flask import Flask
def create_app():
app = Flask(__name__)
from flaskr.mysite1.views import mysite1_bp
from flaskr.mysite2.views import mysite2_bp
app.register_blueprint(mysite1_bp)
app.register_blueprint(mysite2_bp)
return app
3.setup.py で__init__.pyに定義したアプリケーション情報を取得し、アプリを起動する。
from flaskr import create_app
from flask import render_template
app = create_app() # __init__.appより取得
@app.route('/')
def home():
return render_template('home.html')
if __name__ == '__main__':
app.run(host='0.0.0.0', port=5000, debug=True)
##パスワードの暗号化(bcrypt)
Flask-Bcryptを利用してパスワードを暗号化する。
: inport時は「flask_bcrypt」と単語感がアンダースコアである点に注意
>>> from flask_bcrypt import Bcrypt
: bcryptオブジェクトの作成
>>> bcrypt = Bcrypt()
>>> testpass = 'password'
: パスワードのハッシュ化
>>> hashed_password = bcrypt.generate_password_hash(password=testpass)
>>> hashed_password
b'$2b$12$3B0I.CHMIEya1OdyI/m44Od7I.TKhRLiOA.EMMWQP3MgUXgr9dkYG'
: ハッシュ化パスワードとの正誤比較
>>> bcrypt.check_password_hash(hashed_password, 'password')
True
>>> bcrypt.check_password_hash(hashed_password, 'pass')
False
サンプル
from flask_bcrypt import generate_password_hash, check_password_hash
class User(UserMixin, db.Model):
__tablename__ = 'users'
id = db.Column(db.Integer, primary_key=True)
email = db.Column(db.String(64), unique=True, index=True)
username = db.Column(db.String(64), index=True)
password = db.Column(db.String(128))
def __init__(self, email, username, password):
self.email = email
self.username = username
# フォームから渡されたpasswordの値を暗号化して変数に格納する。
self.password = generate_password_hash(password)
def validate_password(self, password):
# 関数に渡されたパスワードが正しいか比較する。
return check_password_hash(self.password, password)