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装饰器decorator用法实例
Nov 10 Python
Python字符串逐字符或逐词反转方法
May 21 Python
Python写的一个定时重跑获取数据库数据
Dec 28 Python
pandas全表查询定位某个值所在行列的方法
Apr 12 Python
Numpy中的mask的使用
Jul 21 Python
python实现飞机大战
Sep 11 Python
对Python发送带header的http请求方法详解
Jan 02 Python
5款Python程序员高频使用开发工具推荐
Apr 10 Python
Python实现最大子序和的方法示例
Jul 05 Python
python循环输出三角形图案的例子
Nov 22 Python
DataFrame.to_excel多次写入不同Sheet的实例
Dec 02 Python
python 将html转换为pdf的几种方法
Dec 29 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
ajax php 实现写入数据库
2009/09/02 PHP
php file_exists 检查文件或目录是否存在的函数
2010/05/10 PHP
几个有用的php字符串过滤,转换函数代码
2012/05/01 PHP
php生成N个不重复的随机数实例
2013/11/12 PHP
php数组去重实例及分析
2013/11/26 PHP
PHP中把错误日志保存在系统日志中(Windows系统)
2015/06/23 PHP
PHP实现大数(浮点数)取余的方法
2017/02/18 PHP
兼容多浏览器的iframe自适应高度(ie8 、谷歌浏览器4.0和 firefox3.5.3)
2009/11/04 Javascript
Extjs TimeField 显示正常时间格式的代码
2011/06/28 Javascript
Javascript图像处理—亮度对比度应用案例
2013/01/03 Javascript
caller和callee的区别介绍及演示结果
2013/03/10 Javascript
提升PHP安全:8个必须修改的PHP默认配置
2014/11/17 Javascript
javascript计时器详解
2015/02/28 Javascript
jquery图片切换实例分析
2015/04/15 Javascript
jQuery基于图层模仿五星星评价功能的方法
2015/05/07 Javascript
JavaScript实现简洁的俄罗斯方块完整实例
2016/03/01 Javascript
input框中自动展示当前日期yyyy/mm/dd的实现方法
2017/07/06 Javascript
JS实现数组去重方法总结(六种方法)
2017/07/14 Javascript
微信小程序如何获取用户头像和昵称
2019/09/23 Javascript
Vue 用Vant实现时间选择器的示例代码
2019/10/25 Javascript
vue中beforeRouteLeave实现页面回退不刷新的示例代码
2019/11/01 Javascript
你不知道的 TypeScript 高级类型(小结)
2020/08/28 Javascript
基于Python安装pyecharts所遇的问题及解决方法
2019/08/12 Python
Django Admin中增加导出Excel功能过程解析
2019/09/04 Python
分享PyCharm的几个使用技巧
2019/11/10 Python
使用scrapy ImagesPipeline爬取图片资源的示例代码
2020/09/28 Python
美国最灵活的移动提供商:Tello
2017/07/18 全球购物
医学生个人求职信范文
2013/09/24 职场文书
购房意向书范本
2014/04/01 职场文书
家长寄语大全
2014/04/02 职场文书
党员自我评议个人对照检查材料
2014/09/16 职场文书
法人授权委托书样本
2014/09/19 职场文书
车队安全员岗位职责
2015/02/15 职场文书
详解MySQL事务的隔离级别与MVCC
2021/04/22 MySQL
ORM模型框架操作mysql数据库的方法
2021/07/25 MySQL
Mysql 8.x 创建用户以及授予权限的操作记录
2022/04/18 MySQL