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 相关文章推荐
Python3基础之条件与循环控制实例解析
Aug 13 Python
Python类的动态修改的实例方法
Mar 24 Python
Python3 执行系统命令并获取实时回显功能
Jul 09 Python
python的pstuil模块使用方法总结
Jul 26 Python
python解析命令行参数的三种方法详解
Nov 29 Python
Python实现手机号自动判断男女性别(实例解析)
Dec 22 Python
TFRecord文件查看包含的所有Features代码
Feb 17 Python
python shapely.geometry.polygon任意两个四边形的IOU计算实例
Apr 12 Python
python进度条显示之tqmd模块
Aug 22 Python
Python常用外部指令执行代码实例
Nov 05 Python
通过python-pptx模块操作ppt文件的方法
Dec 26 Python
Python如何利用pandas读取csv数据并绘图
Jul 07 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开发框架总结收藏
2008/04/24 PHP
让ThinkPHP支持大小写url地址访问的方法
2014/10/31 PHP
php字符串截取函数mb_substr用法实例分析
2019/06/25 PHP
Confirmer JQuery确认对话框组件
2010/06/09 Javascript
使用jQuery模板来展现json数据的代码
2010/10/22 Javascript
js 定时器setTimeout无法调用局部变量的解决办法
2013/11/28 Javascript
jQuery前端框架easyui使用Dialog时bug处理
2014/12/05 Javascript
JS获取时间的方法
2015/01/21 Javascript
jQuery插件jRumble实现网页元素抖动
2015/06/05 Javascript
javascript实现tab切换的四种方法
2015/11/05 Javascript
实例详解AngularJS实现无限级联动菜单
2016/01/15 Javascript
浅析Bootstrap组件之面板组件
2016/05/04 Javascript
AngularJS基础 ng-init 指令简单示例
2016/08/02 Javascript
详谈Angular路由与Nodejs路由的区别
2017/03/05 NodeJs
angular4 JavaScript内存溢出问题
2018/03/06 Javascript
vue如何使用async、await实现同步请求
2019/12/09 Javascript
npm qs模块使用详解
2020/02/07 Javascript
[19:24]DOTA2客户端使用指南 一分钟快速设置轻松超神
2013/09/24 DOTA
[02:34]肉山说——泡妞篇
2014/09/16 DOTA
Python脚本实时处理log文件的方法
2016/11/21 Python
Python+OpenCV让电脑帮你玩微信跳一跳
2018/01/04 Python
5个很好的Python面试题问题答案及分析
2018/01/19 Python
Python操作json的方法实例分析
2018/12/06 Python
python3.6+django2.0+mysql搭建网站过程详解
2019/07/24 Python
在python中使用pyspark读写Hive数据操作
2020/06/06 Python
Python使用jpype模块调用jar包过程解析
2020/07/29 Python
pandas参数设置的实用小技巧
2020/08/23 Python
pip已经安装好第三方库但pycharm中import时还是标红的解决方案
2020/10/09 Python
pycharm配置QtDesigner的超详细方法
2021/01/25 Python
带有css3动画效果的兼容多浏览器简单导航条示例
2014/01/26 HTML / CSS
微软美国官方网站:Microsoft美国
2018/05/10 全球购物
新春联欢会主持词
2014/03/24 职场文书
学生保证书
2015/01/16 职场文书
篮球比赛通讯稿
2015/07/18 职场文书
初三数学教学反思
2016/02/17 职场文书
Python tensorflow卷积神经Inception V3网络结构
2022/05/06 Python