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中的CURL PycURL使用例子
Jun 01 Python
Python fileinput模块使用介绍
Nov 30 Python
理解Python中的With语句
Feb 02 Python
python中如何使用朴素贝叶斯算法
Apr 06 Python
python用plt画图时,cmp设置方法
Dec 13 Python
Python-Seaborn热图绘制的实现方法
Jul 15 Python
Python序列化pickle模块使用详解
Mar 05 Python
Django choices下拉列表绑定实例
Mar 13 Python
详解使用python3.7配置开发钉钉群自定义机器人(2020年新版攻略)
Apr 01 Python
Python+redis通过限流保护高并发系统
Apr 15 Python
Python结合Window计划任务监测邮件的示例代码
Aug 05 Python
matplotlib交互式数据光标实现(mplcursors)
Jan 13 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内核探索:哈希表碰撞攻击原理
2015/07/31 PHP
详解PHP神奇又有用的Trait
2019/03/25 PHP
thinkphp框架表单数组实现图片批量上传功能示例
2020/04/04 PHP
一直复略了的一个问题,关于表单重复提交
2007/02/15 Javascript
Open and Print a Word Document
2007/06/15 Javascript
ExtJS 2.0实用简明教程 之ExtJS版的Hello
2009/04/29 Javascript
Jquery 最近浏览过的商品的功能实现代码
2010/05/14 Javascript
JavaScript表达式:URL 协议介绍
2013/03/10 Javascript
js 金额格式化来回转换示例
2014/02/23 Javascript
JavaScript判断是否为数字的4种方法及效率比较
2015/04/01 Javascript
VUEJS实战之利用laypage插件实现分页(3)
2016/06/13 Javascript
AngularJS  ng-table插件设置排序
2016/09/21 Javascript
使用base64对图片的二进制进行编码并用ajax进行显示
2017/01/03 Javascript
简单实现js无缝滚动效果
2017/02/05 Javascript
Angular模版驱动表单的使用总结
2018/05/05 Javascript
实例详解BootStrap的动态模态框及静态模态框
2018/08/13 Javascript
vue cli3.0打包上线静态资源找不到路径的解决操作
2020/08/03 Javascript
javascript中导出与导入实现模块化管理教程
2020/12/03 Javascript
javascript实现放大镜功能
2020/12/09 Javascript
[52:52]DOTA2上海特级锦标赛C组资格赛#1 OG VS LGD第三局
2016/02/27 DOTA
Python单例模式实例详解
2017/03/01 Python
Python 类的继承实例详解
2017/03/25 Python
python自定义异常实例详解
2017/07/11 Python
python机器学习之神经网络(三)
2017/12/20 Python
PyQT实现多窗口切换
2018/04/20 Python
Python中@property的理解和使用示例
2019/06/11 Python
详解PyCharm+QTDesigner+PyUIC使用教程
2019/06/13 Python
Django 限制访问频率的思路详解
2019/12/24 Python
Python3 全自动更新已安装的模块实现
2020/01/06 Python
python正则表达式 匹配反斜杠的操作方法
2020/08/07 Python
python Scrapy框架原理解析
2021/01/04 Python
canvas仿写贝塞尔曲线的示例代码
2017/12/29 HTML / CSS
医学专业大学生求职的自我评价
2013/11/27 职场文书
土地转让协议书
2014/09/27 职场文书
Nginx反向代理多个服务器的实现方法
2021/03/31 Servers
如何使用pdb进行Python调试
2021/06/30 Python