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中动态创建类实例的方法
Mar 24 Python
利用python模拟sql语句对员工表格进行增删改查
Jul 05 Python
Python实现购物系统(示例讲解)
Sep 13 Python
转换科学计数法的数值字符串为decimal类型的方法
Jul 16 Python
使用Python实现一个栈判断括号是否平衡
Aug 23 Python
使用Python实现正态分布、正态分布采样
Nov 20 Python
使用Rasterio读取栅格数据的实例讲解
Nov 26 Python
python实现将视频按帧读取到自定义目录
Dec 10 Python
Pytorch 数据加载与数据预处理方式
Dec 31 Python
Python实现获取当前目录下文件名代码详解
Mar 10 Python
浅谈Keras的Sequential与PyTorch的Sequential的区别
Jun 17 Python
简单了解Python字典copy与赋值的区别
Sep 16 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框架Swoole定时器Timer特性分析
2014/08/19 PHP
php PDO实现的事务回滚示例
2017/03/23 PHP
Laravel学习教程之IOC容器的介绍与用例
2017/08/15 PHP
PHP 实现手机端APP支付宝支付功能
2018/06/07 PHP
PHP常用函数之base64图片上传功能详解
2019/10/21 PHP
php+layui数据表格实现数据分页渲染代码
2019/10/26 PHP
php获取是星期几的的一些常用姿势
2019/12/15 PHP
Javascript 构造函数,公有,私有特权和静态成员定义方法
2009/11/30 Javascript
关于JS字符串函数String.replace()
2013/04/07 Javascript
JS中实现replaceAll的方法(实例代码)
2013/11/12 Javascript
ExtJS4给Combobox设置列表中的默认值示例
2014/05/02 Javascript
JS实现的页面自定义滚动条效果
2015/10/26 Javascript
原生JS实现图片翻书效果
2017/02/16 Javascript
微信小程序中显示html格式内容的方法
2017/04/25 Javascript
JS实现带导航城市列表以及输入搜索功能
2018/01/04 Javascript
理解Koa2中的async&await的用法
2018/02/05 Javascript
基于vue开发微信小程序mpvue-docs跳转页面功能
2019/04/10 Javascript
[02:50]2014DOTA2 TI预选赛预选赛 大神专访第一弹!
2014/05/21 DOTA
[01:02:06]LGD vs Mineski Supermajor 胜者组 BO3 第二场 6.5
2018/06/06 DOTA
python中matplotlib实现最小二乘法拟合的过程详解
2017/07/11 Python
python批量读取txt文件为DataFrame的方法
2018/04/03 Python
利用python实现汉字转拼音的2种方法
2019/08/12 Python
解决django-xadmin列表页filter关联对象搜索问题
2019/11/15 Python
Django之form组件自动校验数据实现
2020/01/14 Python
Python QTimer实现多线程及QSS应用过程解析
2020/07/11 Python
python调用有道智云API实现文件批量翻译
2020/10/10 Python
python不同版本的_new_不同点总结
2020/12/09 Python
python 基于pygame实现俄罗斯方块
2021/03/02 Python
美国知名户外用品畅销中心:Sierra Trading Post
2016/07/19 全球购物
Hashtable 添加内容的方式有哪几种,有什么区别?
2012/04/08 面试题
一些Unix笔试题和面试题
2013/01/22 面试题
优秀党员转正的自我评价
2013/10/06 职场文书
教师新年寄语
2014/04/03 职场文书
中国梦团日活动总结
2014/07/07 职场文书
开业庆典活动策划方案
2014/09/21 职场文书
2016教师校本培训心得体会
2016/01/08 职场文书