LoginSignup
4
3

More than 3 years have passed since last update.

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

Posted at

TL;DL

Udemyの下記講座の受講記録

Python+FlaskでのWebアプリケーション開発講座!!~0からFlaskをマスターしてSNSを作成する~
https://www.udemy.com/course/flaskpythonweb/

この記事ではFlaskのBluePrintによるアプリケーション管理とbcryptによるパスワードの暗号化について記載する。

BluePrintとは

作成したアプリケーションを機能などの単位別にグループ分けして管理したい場合に利用する機能。

例えば、個人情報管理機能(site1)とデータ照会機能(site2)のモジュールを別々に管理したい場合に、BluePrintを使用して分割管理することで、アプリケーションとしての見た目は1つでも、内部管理的には複数のアプリケーションとして分割管理することが可能となる。

基本構造
スクリーンショット 2021-01-03 17.01.22.png

構文

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)
4
3
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
4
3