1. 程式人生 > >Flask-login 簡單 Demo, 最簡單的實現登入方法

Flask-login 簡單 Demo, 最簡單的實現登入方法

Flask-login 簡單 Demo, 最簡單的實現登入方法

* 當使用MethodView的時候,login_required 使用方法

class XxxxView(MethodView):


    decorators = [login_required]  # 相當於 @login_required 裝飾圈

    def get(self):


主檔案 

from flask_sqlalchemy import SQLAlchemy
from flask import Flask, redirect, url_for, request
from flask_login import LoginManager, current_user, login_user, login_required

app = Flask(__name__)
app.secret_key = 'Sqsdsffqrhgh.,/1#$%^&'
app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///./db/blog.db'
app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = True
app.debug = True

db = SQLAlchemy(app)
login_manager = LoginManager()
login_manager.init_app(app)

password = '123'   #只要使用者輸入的密碼是 123 就可以登入


@login_manager.user_loader    #使用user_loader裝飾器的回撥函式非常重要,他將決定 user 物件是否在登入狀態
def user_loader(id):          #這個id引數的值是在 login_user(user)中傳入的 user 的 id 屬性
    from model.model import User
    user = User.query.filter_by(id=id).first()
    return user

# 新增登入檢視,如果是GET方法,返回一個簡單的表單

@app.route('/login/', methods=['GET', 'POST'])
def login():
    from model.model import User
    if request.method == 'GET':
        return '''
        <form action="#" method="POST">
    <span>請輸入賬號</span>
    <input type="text" name="name" id="name" placeholder="name">
    <span>請輸入密碼</span>
    <input type="password" name="pw" id="pw" placeholder="password">
    <input type="submit" name="submit">
       </form>
        '''
    name = request.form.get('name')
    if request.form.get('pw') == password:
        user = User.query.filter_by(name=name).first()
        if not user:
            user = User(name=name)
            db.session.add(user)
            db.session.commit()
        login_user(user)
        return redirect(url_for('index'))
    return 'Bad login'

#如果密碼是 123 就會跳轉到檢視函式 index 上

@app.route('/index/')
@login_required
def index():
    user = current_user
    return 'HelloWorld'

if __name__ == '__main__':
    app.run()

model.py

from model import *

'''
建立類的時候繼承UserMixin ,有一些使用者相關屬性

* is_authenticated :是否被驗證
* is_active : 是否被啟用
* is_anonymous : 是否是匿名使用者
* get_id() : 獲得使用者的id,並轉換為 Unicode 型別

'''

class User(db.Model,UserMixin):

    __tablename__ = 'login_users'
    id = db.Column(db.Integer,primary_key=True)
    name = db.Column(db.String(50),unique=True)
    login_count = db.Column(db.Integer,default=0)
    last_login_ip = db.Column(db.String(128),default='unknown')

在來一個功能全點的Demo

from flask_sqlalchemy import SQLAlchemy
from flask import Flask, redirect, url_for, request, flash, render_template
from flask_login import LoginManager, login_user, login_required, logout_user

app = Flask(__name__)
app.secret_key = 'Sqsdsffqrhgh.,/1#$%^&'
app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///./db/blog.db'
app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = True
app.debug = True

db = SQLAlchemy(app)
login_manager = LoginManager()
login_manager.init_app(app)

login_manager.login_view = "login"  # 定義登入的 檢視
login_manager.login_message = '請登入以訪問此頁面'  # 定義需要登入訪問頁面的提示訊息


@login_manager.user_loader  # 使用user_loader裝飾器的回撥函式非常重要,他將決定 user 物件是否在登入狀態
def user_loader(id):  # 這個id引數的值是在 login_user(user)中傳入的 user 的 id 屬性
    from model.model import User
    user = User.query.filter_by(id=id).first()
    return user


# 新增登入檢視,如果是GET方法,返回一個簡單的表單

@app.route('/login/', method=['GET', 'POST'])
def login():
    from model.model import User
    if request.method == 'POST':
        name = request.form.get('name')
        user = User.query.filter_by(name=name).first()
        if not user:
            flash('該使用者不存在')
        elif request.form.get('pwd') != user.pwd:
            flash('密碼錯誤')
        else:
            login_user(user, remember=True)
            next_url = request.args.get('next')
            return redirect(next_url or url_for('login_success'))
    return render_template('login.html')  # 如果密碼是 123 就會跳轉到檢視函式 index 上


@app.route('/')
@login_required
def index():
    return 'Hello Tank'


@app.route('/succees/')
@login_required
def login_success():
    return render_template('base.html')


@app.route('/logout/')
@login_required
def logout():
    logout_user()  # 登出使用者
    return '已經退出登入'


@app.errorhandler(404)
def page_not_found(error):
    return render_template('page_not_found.html'), 404


if __name__ == '__main__':
    app.run()