Flaskで作るSNS Flask(Blueprint,bcrypt)編


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)