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代码实例
Feb 04 Python
Python中zfill()方法的使用教程
May 20 Python
利用Python循环(包括while&for)各种打印九九乘法表的实例
Nov 06 Python
Python实现针对给定单链表删除指定节点的方法
Apr 12 Python
Python中交换两个元素的实现方法
Jun 29 Python
python如何统计代码运行的时长
Jul 24 Python
Python调用graphviz绘制结构化图形网络示例
Nov 22 Python
Python HTMLTestRunner测试报告view按钮失效解决方案
May 25 Python
MxNet预训练模型到Pytorch模型的转换方式
May 25 Python
python程序需要编译吗
Jun 19 Python
keras 指定程序在某块卡上训练实例
Jun 22 Python
使用python修改文件并立即写回到原始位置操作(inplace读写)
Jun 28 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中的一些数组排序方法分享
2012/07/20 PHP
TopList标签和JavaScript结合两例
2007/08/12 Javascript
JavaScript arguments 多参传值函数
2010/10/24 Javascript
jQuery Tools Dateinput使用介绍
2012/07/14 Javascript
Bootstrap输入框组件简单实现代码
2017/03/06 Javascript
JS操作xml对象转换为Json对象示例
2017/03/25 Javascript
微信小程序教程系列之设置标题栏和导航栏(7)
2020/06/29 Javascript
jQuery手风琴的简单制作
2017/05/12 jQuery
详解vuex的简单使用
2018/03/12 Javascript
Vue的路由动态重定向和导航守卫实例
2018/03/17 Javascript
vue表单自定义校验规则介绍
2018/08/28 Javascript
基于vue.js实现分页查询功能
2018/12/29 Javascript
JQuery常用选择器功能与用法实例分析
2019/12/23 jQuery
微信小程序vant弹窗组件的实现方式
2020/02/21 Javascript
AutoJs实现刷宝短视频的思路详解
2020/05/22 Javascript
从0到1学习JavaScript编写贪吃蛇游戏
2020/07/28 Javascript
vue 项目引入echarts 添加点击事件操作
2020/09/09 Javascript
解决Can't find variable: SockJS vue项目的问题
2020/09/22 Javascript
[16:19]教你分分钟做大人——风暴之灵
2015/03/11 DOTA
Python实现螺旋矩阵的填充算法示例
2017/12/28 Python
基于python的图片修复程序(实现水印去除)
2018/06/04 Python
使用Python抓取豆瓣影评数据的方法
2018/10/17 Python
pthon贪吃蛇游戏详细代码
2019/01/27 Python
python从内存地址上加载python对象过程详解
2020/01/08 Python
Python图像处理库PIL的ImageGrab模块介绍详解
2020/02/26 Python
Python tkinter布局与按钮间距设置方式
2020/03/04 Python
Python实现疫情通定时自动填写功能(附代码)
2020/05/27 Python
python实现马丁策略的实例详解
2021/01/15 Python
微软香港官网及网上商店:Microsoft HK
2016/09/01 全球购物
Perfume’s Club法国站:购买香水和化妆品
2019/05/02 全球购物
Java语言程序设计测试题判断题部分
2013/01/06 面试题
大学自主招生推荐信
2014/05/10 职场文书
文秘专业应届生求职信
2014/05/26 职场文书
硕士生找工作求职信
2014/07/05 职场文书
幼儿园教师辞职信
2019/06/21 职场文书
Django+Nginx+uWSGI 定时任务的实现方法
2022/01/22 Python