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模拟登录并且保持cookie的方法详解
Apr 04 Python
Pycharm 创建 Django admin 用户名和密码的实例
May 30 Python
Flask入门之上传文件到服务器的方法示例
Jul 18 Python
python爬虫获取百度首页内容教学
Dec 23 Python
Python发展史及网络爬虫
Jun 19 Python
python实现复制文件到指定目录
Oct 16 Python
Python定义函数时参数有默认值问题解决
Dec 19 Python
Python高阶函数、常用内置函数用法实例分析
Dec 26 Python
TensorFlow查看输入节点和输出节点名称方式
Jan 04 Python
python 爬取百度文库并下载(免费文章限定)
Dec 04 Python
python实现监听键盘
Apr 26 Python
基于Python绘制子图及子图刻度的变换等的问题
May 23 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 面向对象 final类与final方法
2010/05/05 PHP
php定时执行任务设置详解
2015/02/06 PHP
PHP+Apache实现二级域名之间共享cookie的方法
2019/07/24 PHP
php实现的数组转xml案例分析
2019/09/28 PHP
jQuery学习2 选择器的使用说明
2010/02/07 Javascript
浅谈Node.js中的定时器
2015/06/18 Javascript
基于HTML模板和JSON数据的JavaScript交互(移动端)
2016/04/06 Javascript
JavaScript实现输入框与清空按钮联动效果
2016/09/09 Javascript
javascript实现文字无缝滚动
2016/12/27 Javascript
浅谈React Native 中组件的生命周期
2017/09/08 Javascript
vue动画效果实现方法示例
2019/03/18 Javascript
24个ES6方法解决JS实际开发问题(小结)
2020/05/31 Javascript
[01:18:33]Secret vs VGJ.S Supermajor小组赛C组 BO3 第一场 6.3
2018/06/04 DOTA
[02:55]2018DOTA2国际邀请赛勇士令状不朽珍藏Ⅲ饰品一览
2018/08/01 DOTA
深入解析Python中的WSGI接口
2015/05/11 Python
Python中有趣在__call__函数
2015/06/21 Python
Python for Informatics 第11章 正则表达式(一)
2016/04/21 Python
把pandas转换int型为str型的方法
2019/01/29 Python
python实战串口助手_解决8串口多个发送的问题
2019/06/12 Python
python实现静态web服务器
2019/09/03 Python
django多种支付、并发订单处理实例代码
2019/12/13 Python
python进度条显示-tqmd模块的实现示例
2020/08/23 Python
解决python和pycharm安装gmpy2 出现ERROR的问题
2020/08/28 Python
python 常用日期处理-- datetime 模块的使用
2020/09/02 Python
Python 生成短8位唯一id实战教程
2021/01/13 Python
HTML5学习笔记之History API
2015/02/26 HTML / CSS
妇科医生自荐信
2013/11/05 职场文书
上课玩手机检讨书
2014/02/08 职场文书
初级会计求职信范文
2014/02/15 职场文书
校园公益广告语
2014/03/13 职场文书
C++程序员求职信
2014/05/07 职场文书
最美护士演讲稿
2014/08/27 职场文书
《爱的教育》读书心得
2014/11/08 职场文书
家长意见书
2015/06/04 职场文书
MySQL中in和exists区别详解
2021/06/03 MySQL
Vue的生命周期一起来看看
2022/02/24 Vue.js