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 文件操作技巧(File operation) 实例代码分析
Aug 11 Python
压缩包密码破解示例分享(类似典破解)
Jan 17 Python
Python程序设计入门(3)数组的使用
Jun 16 Python
python中的内置函数getattr()介绍及示例
Jul 20 Python
Python os模块介绍
Nov 30 Python
Python使用logging结合decorator模式实现优化日志输出的方法
Apr 16 Python
Python的爬虫程序编写框架Scrapy入门学习教程
Jul 02 Python
Django MEDIA的配置及用法详解
Jul 25 Python
tensorflow实现对张量数据的切片操作方式
Jan 19 Python
一篇文章带你搞懂Python类的相关知识
May 20 Python
Django对接elasticsearch实现全文检索的示例代码
Aug 02 Python
python自动化操作之动态验证码、滑动验证码的降噪和识别
Aug 30 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.ini以达到屏蔽错误信息并记录日志
2013/06/16 PHP
解析php中的fopen()函数用打开文件模式说明
2013/06/20 PHP
php字符串按照单词进行反转的方法
2015/03/14 PHP
PHP+Ajax实现无刷新分页实例详解(附demo源码下载)
2016/04/07 PHP
CodeIgniter框架数据库基本操作示例
2018/05/24 PHP
php代码调试利器firephp安装与使用方法分析
2018/08/21 PHP
Thinkphp5框架实现获取数据库数据到视图的方法
2019/08/14 PHP
HR vs CL BO3 第一场 2.13
2021/03/10 DOTA
屏蔽鼠标右键、Ctrl+n、shift+F10、F5刷新、退格键 的javascript代码
2007/04/01 Javascript
JavaScript中的闭包介绍
2015/03/15 Javascript
详解addEventListener的三个参数之useCapture
2015/03/16 Javascript
Javascript自定义事件详解
2017/01/13 Javascript
jquery获取下拉框中的循环值
2017/02/08 Javascript
如何编写jquery插件
2017/03/29 jQuery
Vue2递归组件实现树形菜单
2017/04/10 Javascript
JS内部事件机制之单线程原理
2018/07/02 Javascript
JavaScript使用Math.random()生成简单的验证码
2019/01/21 Javascript
[01:10:57]Liquid vs OG 2018国际邀请赛小组赛BO2 第一场 8.16
2018/08/17 DOTA
Python编码类型转换方法详解
2016/07/01 Python
python进阶之自定义可迭代的类
2019/08/20 Python
Python 利用邮件系统完成远程控制电脑的实现(关机、重启等)
2019/11/19 Python
pytorch 图像预处理之减去均值,除以方差的实例
2020/01/02 Python
Django bulk_create()、update()与数据库事务的效率对比分析
2020/05/15 Python
PIP和conda 更换国内安装源的方法步骤
2020/09/21 Python
中国专业的综合网上购物商城:京东
2016/08/02 全球购物
家庭睡衣和家庭用品:Little Blue House
2018/03/18 全球购物
英国高街奥特莱斯:Highstreet Outlet
2019/11/21 全球购物
应届生财务会计求职信
2013/11/05 职场文书
毕业自我评价范文
2013/11/17 职场文书
行政总经理岗位职责
2013/12/05 职场文书
保安岗位职责
2014/02/21 职场文书
网络编辑职责
2014/03/01 职场文书
租房协议书怎么写
2014/04/10 职场文书
12.4法制宣传日标语
2014/10/08 职场文书
《开国大典》教学反思
2016/02/16 职场文书
经典哲理警句:志不真则心不热,心不热则功不贤
2019/11/14 职场文书