flask相關建設主題
密碼hash
使用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’) ‘加密
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)