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程序与服务器连接的WSGI接口
Apr 29 Python
Python实现身份证号码解析
Sep 01 Python
Python生成密码库功能示例
May 23 Python
最近Python有点火? 给你7个学习它的理由!
Jun 26 Python
django admin添加数据自动记录user到表中的实现方法
Jan 05 Python
python操作excel文件并输出txt文件的实例
Jul 10 Python
Python爬取成语接龙类网站
Oct 19 Python
python变量的存储原理详解
Jul 10 Python
python模块常用用法实例详解
Oct 17 Python
Python with语句和过程抽取思想
Dec 23 Python
详解Python中的Lock和Rlock
Jan 26 Python
pyqt5打包成exe可执行文件的方法
May 14 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写入数据库类代码分享
2011/07/26 PHP
测试PHP连接MYSQL成功与否的代码
2013/08/16 PHP
ThinkPHP中pathinfo的访问模式、路径访问模式及URL重写总结
2014/08/23 PHP
PHP中执行cmd命令的方法
2014/10/11 PHP
CodeIgniter读写分离实现方法详解
2016/01/20 PHP
php实现登录tplink WR882N获取IP和重启的方法
2016/07/20 PHP
PHP实现创建微信自定义菜单的方法示例
2017/07/14 PHP
Laravel登录失败次数限制的实现方法
2020/08/26 PHP
picChange 图片切换特效的函数代码
2010/05/06 Javascript
自己整理的一个javascript日期处理函数
2010/10/16 Javascript
jquery向.ashx文件post中文乱码问题的解决方法
2011/03/28 Javascript
angularjs指令中的compile与link函数详解
2014/12/06 Javascript
Bootstrap基本插件学习笔记之标签切换(17)
2016/12/08 Javascript
JavaScript数据结构之链表的实现
2017/03/19 Javascript
详解使用angular的HttpClient搭配rxjs
2017/09/01 Javascript
vue中当图片地址无效的时候,显示默认图片的方法
2018/09/18 Javascript
JS实现的获取银行卡号归属地及银行卡类型操作示例
2019/01/08 Javascript
vue element-ui el-date-picker限制选择时间为当天之前的代码
2019/11/07 Javascript
JS面向对象实现飞机大战
2020/08/26 Javascript
Vue+Element ui 根据后台返回数据设置动态表头操作
2020/09/21 Javascript
[03:42]2014DOTA2西雅图国际邀请赛 Navi战队巡礼
2014/07/07 DOTA
python操作gmail实例
2015/01/14 Python
Python命令行参数解析模块optparse使用实例
2015/04/13 Python
python通过百度地图API获取某地址的经纬度详解
2018/01/28 Python
使用tensorflow进行音乐类型的分类
2020/08/14 Python
基于Html5实现的语音搜索功能
2019/05/13 HTML / CSS
关于Java finally的面试题
2016/04/27 面试题
仓库管理员岗位职责
2014/03/19 职场文书
文明工地标语
2014/06/16 职场文书
个人授权委托书模板
2014/09/14 职场文书
党员带头倡议书
2015/04/29 职场文书
2016年第十四个公民道德宣传日活动总
2016/04/01 职场文书
五年级作文之想象作文
2019/10/30 职场文书
Python绘制分类图的方法
2021/04/20 Python
win sever 2022如何占用操作主机角色
2022/06/25 Servers
python计算列表元素与乘积详情
2022/08/05 Python