flask相關建設主題

密碼hash

Steven Wang
4 min readNov 8, 2020

使用Security Helpers的兩個方法
generate_oasswird_hash
check_password_hash

python command
%python
from werkzeug.security import generate_password_hash, check_password_hash
generate_password_hash(‘admin’) ‘加密

每次hash都不會一樣

b=generate_password_hash(‘admin’)
check_password_hash(b, ‘admin’) ‘核對密碼 返回true/false

command python檢查(完整的啟動python command)

python>>>
>>> from twittor import db, create_app
>>> from twittor.models import User
>>> app = create_app() ‘實體化
>>> app.app_context().push() ‘push方法
>>> u = User(username=’admin’, email=’admin@admin.com’) ‘一個實例
>>> u.set_password(‘admin’) ’設定hash密碼
>>> u
id=None, username=admin, email=admin@admin.com,password, password_hashpbkdf2:sha256:150000$A1X5TSLh$bbcae5a7b0321afc7df1a524cb909a57dd664350f0685ac21a6199a9520f63f1
>>> db.session.add(u)
>>> db.session.commit() ‘新增入資料庫
>>> User.query.all() ‘有資料
[id=1, username=admin, email=admin@admin.com,password, password_hashpbkdf2:sha256:150000$A1X5TSLh$bbcae5a7b0321afc7df1a524cb909a57dd664350f0685ac21a6199a9520f63f1]
>>> User.query.filter_by(username=’admin’) ’有東西
<flask_sqlalchemy.BaseQuery object at 0x10c45a2b0>
>>> User.query.filter_by(username=’admin’).first() ‘first()方法
id=1, username=admin, email=admin@admin.com,password, password_hashpbkdf2:sha256:150000$A1X5TSLh$bbcae5a7b0321afc7df1a524cb909a57dd664350f0685ac21a6199a9520f63f1
>>> User.query.filter_by(username=’adminn’).first() ‘沒有adminn返回None

移除csrf警吿

FlaskWTFDeprecationWarning: “csrf_enabled” is deprecated and will be removed in 1.0. Pass meta={‘csrf’: False} instead.

移除csrf_enabled=False

新增class Meta
forms.py / class Meta

Flask_Login用於用戶session的管理

已經登錄過 要被記起來

頁面只允許login的用戶去訪問

pip install flask_login

LoginManager

from flask_login import LoginManager '引入flask_login LoginManager 類

login_manager = LoginManager() ‘定義login為LoginManager的一個實例login_manager.init_app(app) 'login與app進行關聯 初始化

UserMixin提供用戶session的幾個基本方法

is_activate
is_authenticated
is_anonymous
get_id

改造Models / User 將 UserMixin當作父類提供給User繼承,這樣User就會有Mixin的以上方法

models放置user_loader callback回調函數

This callback is used to reload the user object from the user ID stored in the session(要讓app login方法根據id找到用戶)

login_manager內user_loader方法裝飾def load_user

@login_manager.user_loader
def load_user(id)

(session存儲的類型是string要改成int)

login_user

>就可以開始在route.py使用login_user方法,使用login_user(user) (flask_login)的方法去紀錄當前已經通過驗證的用戶

設定config.py/SECERT KEY

current_user

current_user 當前的用戶flask_login的current_user方法

is_authenticated 被認證過

如果被認證過,就不需要再登入
redirect(url_for(‘index’))

logout 登出

route.py/from flask_login import logout_user

route.py
def logout()
logout_user()

templates folder/base.html

base.html
{% if current_user.is_anonymous %}

UserMixin內有is_anonymous方法 是否匿名,沒login就是匿名

強制用戶登錄 沒有登錄不給看@login_required

from flask_login import login_required

未登錄則進入此畫面

以下修改__init__.py,引導頁面到login輸入帳密

跳出登錄頁面輸入正確後,回到原本要進入的頁面next

觀察login?next=OOOXXX,登錄後就會回到原本要進入的頁面(就是OOOXXX)

取出next所帶參數
from flask import request
next_page = request.args.get(‘next’)

轉入
if next_page:
return redirect(next_page)

--

--

Steven Wang
Steven Wang

No responses yet