Flask框架Flask-Principal基本用法实例分析


Posted in Python onJuly 23, 2018

本文实例讲述了Flask框架Flask-Principal基本用法。分享给大家供大家参考,具体如下:

Flask-Principal是Flask框架的一个扩展,主要主件是Identity,Needs,Permission和IdentityContext。

  • Identity:代表用户,从各个位置存储和加载每个请求,包含用户拥有的访问权限。
  • Needs:需求是访问控制的最小粒度,代表了这种情况的具体参数。例如:管理用户、可以编辑帖子.
  • Permission:权限
  • IdentityContext:针对某个权限特定的上下文,可用作上下文管理器或装饰器

安装

pip install flask-principal

初始化

from flask_principal import Principal
principal = Principal()
principal.init_app(app)

权限管理

permissions.py

from flask-principal import Permission,RoleNeed
from functools import wraps
# 定义相关角色
NORMAL = "NORMAL"
ADMIN = "ADMIN"
ROLES = (
  ("NORMAL","普通用户"),
  ("ADMIN","管理员")
)
admin_permission = Permission(RoleNeed(ADMIN))
def admin_authority(func):
  @wraps
  def decorated_view(*args,**kwargs):
    if admin_permission.can():
      return func(*args,**kwargs)
    else:
      return "非Admin用户"
  return decorated_view

添加Role Model

userinfo.py

from app import login_manager
from app.db import Base,engine,session
from sqlalchemy import Column,String,Integer,create_engine
from sqlalchemy_utils.types.choice import ChoiceType
from flask_login import UserMixin
from permissions import ADMIN,ROLES
class User(Base,UserMixin):
  __tablename__ = "user"
  id = Column(Integer,primary_key=True)
  user = Column(String(16))
  password = Column(String(16))
  roles = Column(ChoiceType(ROLES),default=ADMIN)
@login_manager.user_loaded
def user_loaded(id):
  return session.query(User).filter_by(id=id).first()
Base.metadata.create_all(engine)

使用user_loader装饰器的回调函数非常重要,它将决定user对象是否在登录状态。试想只有Admin权限操作的事情,那么此用户是必需先登录,否则无法验证Admin权限。更多Flask-Login相关操作可参考《Flask框架Flask-Login用法》

登录

验证用户与密码等是否正确,后执行Flask-Login登录操作,记录登录状态,验证用户权限

from app import app
from flask import request
from flask_login import login_user
from flask_principal import current_app,identity_changed,Identity
from userinfo import User
from app.db import session
@app.route("/login",methods=["POST"])
def login():
  user = request.form.get("user",None)
  password = request.form.get("password",None)
  if not user or not password:
    ...
  user = session.query(User).filter_by(user=user,password=password).first()
  if not user:
    ...
  # 登录
  login_user(user)
  # 发送信号,载入用户权限
  identity_changed.send(current_app._get_current_object(),identity=Identity(user.id))
  return ...

identity_changed.send()函数会将sender:current_app._get_current_object()当前应用app和身份对象和identity:Identity(user.id)用户对象以信号的新式发送出去,开发者可以用identity_loaded.connect_via(app)接收信号,并载入权限

from flask_login import current_user
from flask_principal import identity_loaded,UserNeed,RoleNeed
@identity_loaded.connect_via(app)
def on_identity_loaded(sendder,identity):
  identity.user = current_user
  if hasattr(current_user,"id"):
    identity.provides.add(UserNeed(current_user.id))
  if hasattr(current_user,"roles"):
    identity.provides.add(RoleNeed(current_user.roles.code))

实现只有Admin权限用户才能操作删除用户

from app import app
from permission import admin_authority
@app.route("/delete_user",methods=["POST"])
@admin_authority
def delete_user():
  ...

希望本文所述对大家基于Flask框架的Python程序设计有所帮助。

Python 相关文章推荐
Python自动登录126邮箱的方法
Jul 10 Python
理解Python垃圾回收机制
Feb 12 Python
win10下Python3.6安装、配置以及pip安装包教程
Oct 01 Python
详解python使用Nginx和uWSGI来运行Python应用
Jan 09 Python
python定向爬取淘宝商品价格
Feb 27 Python
python多线程分块读取文件
Aug 29 Python
Python Django中的STATIC_URL 设置和使用方式
Mar 27 Python
Python中内建模块collections如何使用
May 27 Python
通过cmd进入python的步骤
Jun 16 Python
Python 如何调试程序崩溃错误
Aug 03 Python
Python QT组件库qtwidgets的使用
Nov 02 Python
python模块与C和C++动态库相互调用实现过程示例
Nov 02 Python
Flask框架Flask-Login用法分析
Jul 23 #Python
Django中的文件的上传的几种方式
Jul 23 #Python
flask中的wtforms使用方法
Jul 21 #Python
详解flask表单提交的两种方式
Jul 21 #Python
python实现周期方波信号频谱图
Jul 21 #Python
Flask-Mail用法实例分析
Jul 21 #Python
python实现傅里叶级数展开的实现
Jul 21 #Python
You might like
php intval的测试代码发现问题
2008/07/27 PHP
详解Window7 下开发php扩展
2015/12/31 PHP
Yii2.0表关联查询实例分析
2016/07/18 PHP
使用正则替换变量
2007/05/05 Javascript
点图片上一页下一页翻页效果
2008/07/09 Javascript
基于jQuery的输入框无值自动显示指定数据的实现代码
2011/01/24 Javascript
jQuery学习笔记 更改jQuery对象
2012/09/19 Javascript
poshytip 基于jquery的 插件 主要用于显示微博人的图像和鼠标提示等
2012/10/12 Javascript
jquery中each遍历对象和数组示例
2014/08/05 Javascript
uploadify多文件上传参数设置技巧
2015/11/16 Javascript
JS根据浏览器窗口大小实时动态改变网页文字大小的方法
2016/02/25 Javascript
javascript中replace使用方法总结
2017/03/01 Javascript
js实现通过开始结束控制的计时器
2019/02/25 Javascript
利用es6 new.target来对模拟抽象类的方法
2019/05/10 Javascript
使用layui实现的左侧菜单栏以及动态操作tab项方法
2019/09/10 Javascript
基于iview-admin实现动态路由的示例代码
2019/10/02 Javascript
vue实现五子棋游戏
2020/05/28 Javascript
bootstrap-table后端分页功能完整实例
2020/06/01 Javascript
[18:20]DOTA2 HEROS教学视频教你分分钟做大人-昆卡
2014/06/11 DOTA
[04:42]2015国际邀请赛CDEC战队晋级之路
2015/08/13 DOTA
python中的yield使用方法
2014/02/11 Python
pyqt5的QComboBox 使用模板的具体方法
2018/09/06 Python
Django实现跨域请求过程详解
2019/07/25 Python
python如何进行矩阵运算
2020/06/05 Python
matplotlib图例legend语法及设置的方法
2020/07/28 Python
CSS实现限制字数功能当对象内文本溢出时显示省略标记
2014/08/20 HTML / CSS
附答案的Java面试题
2012/11/19 面试题
七年级历史教学反思
2014/02/05 职场文书
《绿色蝈蝈》教学反思
2014/03/02 职场文书
企业文化口号
2014/06/12 职场文书
会计试用期自我评价
2014/09/19 职场文书
2015年班主任个人工作总结
2015/03/31 职场文书
银行客户经理岗位职责
2015/04/09 职场文书
2015年党务公开工作总结
2015/05/19 职场文书
农贸批发市场管理制度
2015/08/07 职场文书
JS新手入门数组处理的实用方法汇总
2021/04/07 Javascript