使用flask-login完成使用者許可權管理
阿新 • • 發佈:2018-12-18
首先是文件結構
模型中使用者類,繼承UserMixin
from flask_login import UserMixin class User(db.Model,UserMixin): """使用者類""" __tablename__='T_U_User' id=db.Column(db.Integer,primary_key=True) username=db.Column(db.String(50),unique=True) password=db.Column(db.String(50)) departmentId=db.Column(db.Integer,db.ForeignKey('T_U_DEPARTMENT.id')) department=db.relationship('Department',backref=db.backref('user',lazy='dynamic')) operator=db.Column(db.String(50)) operateTime=db.Column(db.DateTime)
主檔案中,宣告loginmanager類初始化
from flask import Flask from flask_sqlalchemy import SQLAlchemy from flask_login import LoginManager,login_required app=Flask(__name__,static_url_path='') app.debug=True app.config['SQLALCHEMY_DATABASE_URI']='sqlite:///./db/manager.db' app.config['SQLALCHEMY_TRACK_MODIFICATIONS']=True app.config['SQLALCHEMY_ECHO']=True app.secret_key='5646465412321swdw' db=SQLAlchemy(app) loginmanager=LoginManager() loginmanager.init_app(app) loginmanager.session_protection='strong' loginmanager.login_view='user_manager.login' loginmanager.login_message='請先登入' @loginmanager.user_loader def load_user(user_id): from model.model import User user=db.session.query(User).get(user_id) return user #匯入藍圖 from model.market import market app.register_blueprint(market) from model.stock_manager import stock_manager app.register_blueprint(stock_manager) from model.user_manager import user_manager app.register_blueprint(user_manager)
登入檢視
class LoginView(MethodView): """登入""" def get(self): return render_template('login.html') def post(self): username=request.form.get('username','').strip() password=request.form.get('pwd','').strip() user=db.session.query(User).filter(User.username==username,User.password==password).first() if not user: flash('使用者名稱或者密碼錯誤') return render_template('login.html') login_user(user) return render_template('index.html')
登出檢視,使用@login_requried,必須是已登入的使用者才可以訪問,否則會跳轉至主檔案中設定的檢視中去
class LogoutView(MethodView):
"""登出"""
@login_required
def get(self):
logout_user()
return render_template('login.html')