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中生成器和yield语句的用法详解
Apr 17 Python
tensorflow实现加载mnist数据集
Sep 08 Python
Python subprocess库的使用详解
Oct 26 Python
Python二叉树的镜像转换实现方法示例
Mar 06 Python
python修改FTP服务器上的文件名
Sep 11 Python
图解python全局变量与局部变量相关知识
Nov 02 Python
python wxpython 实现界面跳转功能
Dec 17 Python
Python3 解决读取中文文件txt编码的问题
Dec 20 Python
Python基于pygame实现单机版五子棋对战
Dec 26 Python
python3.8.1+selenium实现登录滑块验证功能
May 22 Python
Python利用pip安装tar.gz格式的离线资源包
Sep 14 Python
pycharm + django跨域无提示的解决方法
Dec 06 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随机生成福彩双色球号码的2种方法
2013/02/04 PHP
php异常处理方法实例汇总
2015/06/24 PHP
Yii2 队列 shmilyzxt/yii2-queue 简单概述
2017/08/02 PHP
调试php程序的简单步骤
2019/10/04 PHP
如果文字过长,则将过长的部分变成省略号显示
2006/06/26 Javascript
DHTML Slide Show script图片轮换
2008/03/03 Javascript
jQuery 定时局部刷新(setInterval)
2010/11/19 Javascript
jquery 实现二级/三级/多级联动菜单的思路及代码
2013/04/08 Javascript
jquery toolbar与网页浮动工具条具体实现代码
2014/01/12 Javascript
js实现的GridView即表头固定表体有滚动条且可滚动
2014/02/19 Javascript
浅谈jQuery中height与width
2015/07/06 Javascript
jQuery实现表格隔行及滑动,点击时变色的方法【测试可用】
2016/08/20 Javascript
AngularJS 自定义过滤器详解及实例代码
2016/09/14 Javascript
Bootstrap 手风琴菜单的实现代码
2017/01/20 Javascript
Bootstrap面板学习使用
2017/02/09 Javascript
JavaScript实现网页头部进度条刷新
2017/04/16 Javascript
使用jQuery.Pin垂直滚动时固定导航
2017/05/24 jQuery
JS去掉字符串中所有的逗号
2017/10/18 Javascript
详解Vue iview IE浏览器不兼容报错(Iview Bable polyfill)
2019/01/07 Javascript
从0到1搭建Element的后台框架的方法步骤
2019/04/10 Javascript
微信小程序实现拍照画布指定区域生成图片
2019/07/18 Javascript
vue项目接口管理,所有接口都在apis文件夹中统一管理操作
2020/08/13 Javascript
基于postman获取动态数据过程详解
2020/09/08 Javascript
python将多个文本文件合并为一个文本的代码(便于搜索)
2011/03/13 Python
django 捕获异常和日志系统过程详解
2019/07/18 Python
使用Python+selenium实现第一个自动化测试脚本
2020/03/17 Python
欧舒丹俄罗斯官方网站:L’OCCITANE俄罗斯
2019/11/22 全球购物
意大利时尚奢侈品店:D’Aniello Boutique
2021/01/19 全球购物
C/C++程序员常见面试题一
2012/12/08 面试题
西式婚礼主持词
2014/03/13 职场文书
村委会贫困证明范本
2014/09/17 职场文书
英文感谢信范文
2015/01/21 职场文书
保卫工作个人总结
2015/03/03 职场文书
《酸的和甜的》教学反思
2016/02/18 职场文书
position:sticky 粘性定位的几种巧妙应用详解
2021/04/24 HTML / CSS
详细分析PHP7与PHP5区别
2021/06/26 PHP