Flask-login 簡單 Demo, 最簡單的實現登入方法
阿新 • • 發佈:2019-01-04
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()