1. 程式人生 > >Python Flask學習_使用flask-login實現認證藍本(一)

Python Flask學習_使用flask-login實現認證藍本(一)

藍本可以認為是一類路由的集合。一個Web App實現多個藍本的目的是,把不同的路由分開,便於維護。

再來複習一下,建立藍本。

1、在app包下建立新package,命名為auth。

2、建立藍本物件例項

# app/auth/__init__.py
from flask import Blueprint                            #引入Blueprint類

auth = Blueprint('auth',__name__)                        #建立例項

from . import views                                      #引入app/auth/views.py

3、實現檢視函式

# app/auth/views.py

@auth.route('/login')
def login():
    return render_template('auth/login.html')            

注意Flask認為模板的路徑是相對於程式模板資料夾而言的(即app/templates)。因此,render_template('auth/login.html')中的'auth/login.html'其實是auth/templates/auth/login.html

4、在app中註冊auth藍本

# app/__init__.py
def create_app(config_name):
    #...
    from .auth import auth as auth_blueprint                            #引入藍本例項
    app.rgister_blueprint(auth_blueprint,url_prefix='/auth')            #註冊藍本到app
    return app

下面進入正文

Flask-Login是專門用來管理使用者認證系統中的認證狀態,且不依賴特定的認證機制。

使用前,還是老規矩安裝:

# pyCharm Terminal
pip install flask-login

一、準備用於登入的使用者模型

想要使用Flask-Login擴充套件,使用者模型(對應資料庫中的User表)必須實現的方法有:


但是,更簡單的方法是:使用flask_login.UserMixin類。UserMixin類有上述四個方法的預設實現,且能滿足大多數需求。

使用方法是。直接繼承就可以。

還記得,ORM的模型改了,要把更改提交到資料庫需要怎麼做嗎?

二、Flask-Login在程式工廠函式中初始化

from flask_login import LoginManager
login_manager = LoginManager()                                #建立例項
login_manager.session_protection = 'strong'                    #使用者認證的保護級別
login_manager.login_view = 'auth.login'                        #設定登入頁面的端點

def create_app(config_name):
    app = Flask(__name__)
    app.config.from_object(config[config_name])
    #...
    login_manager.init_app(app)                             #註冊到app                        

三、實現一個回撥函式

Flask-Login要求程式實現一個回撥函式,使用指定的識別符號載入使用者。

# app/models.py
from . import login_manager
@login_manager.user_loader                                              #flask-login要求實現的回撥函式
def load_user(user_id):
    return User.query.get(int(user_id))
回撥函式,接受以Unicode字串形式表示的使用者識別符號,在資料庫中用使用者識別符號查詢。如果能找到返回使用者物件,否則 返回None。