从头搭建一个flask鉴权系统之角色

简介: 从头搭建一个flask鉴权系统之角色

知识树


1.用户角色

2.block用户


更新表结构


设计角色表结构

设计一个简单的角色表,关联到WebUser表的role_id字段,而WebUser类新增role_id字段,作为roles表的外键,同时定义初始化角色的静态函数。

Role类代码

class Role(db.Model):
    __tablename__ = 'roles'
    id = db.Column(db.Integer, primary_key=True)
    name = db.Column(db.String(64), unique=True)
    users = db.relationship('WebUser', backref='role')
    @staticmethod
    def init_roles():
        roles = ['User', 'Admin']
        for r in roles:
            role = Role.query.filter_by(name=r).first()
            if role is None:
                role = Role(name=r)
                db.session.add(role)
        db.session.commit()


WebUser表新增字段

role_id = db.Column(db.Integer, db.ForeignKey('roles.id'), default=1)


对于WebUser表类,再增加一个判断是否为admin的方法,这样就可以在路由函数中通过该方法来判断用户是否为admin用户,从而确定权限。

def is_admin(self):
        if self.role_id is 2:
            return True
        else:
            return False


添加测试页面


添加一个只有admin用户才能访问的页面,对于普通用户,则返回对应提示。

@main.route('/onlyadmin')
@login_required
def onlyadmin():
    if current_user.is_admin():
        return 'Your are admin so you can see this page'
    else:
        return 'You are not admin user, Only admin user can access this page'


这样,在真实的场景下,如果我们有些页面是只允许admin访问时,只需要通过is_admin()来做判断即可,或者直接设置,非admin用户,不展示某某页面。


新增block功能


block功能是指,如果用户处于block状态,那么将不能登陆。


新增字段和方法

在WebUser类下新增block_status字段,和is_block方法

class WebUser(UserMixin, db.Model):
    ...
    block_status = db.Column(db.Boolean, default=True)
    ...
    def is_block(self):
        if self.block_status:
            return True
        else:
            return False


在登陆函数中,添加判断

在auth的login函数中,于调用login_user函数前,添加一个判断,如果用户是block状态,则不允许登陆

if user.is_block() is False:
                    flash('You have been blocked, please contact admin')
                    return redirect(url_for('.login'))


手动block用户


用户列表页

添加一个userlist页面,用来展示所有的系统用户,并且每个用户都带有block和unblock按钮

{% extends "base.html" %}
{% import  "bootstrap/wtf.html" as wtf %}
{% block title %}User List{% endblock %}
{% block page_content %}
<div class="container">
    {% for message in get_flashed_messages() %}
    <div class="alert alert-warning">
        <button type="button" class="close" data-dismiss="alert">&times;</button>
        {{ message }}
    </div>
    {% endfor %}
</div>
<div class="page-header">
    <h1>用户列表</h1>
</div>
<div class="col-md-12">
    {% for u in userlist %}
    <p>
    {{ u.username }}
    <a class="btn btn-warning" href="{{ url_for('main.blockuser', username=u.username) }}">block</a>
        <a class="btn btn-primary" href="{{ url_for('main.unblockuser', username=u.username) }}">unblock</a>
     </p>
    {% endfor %}
</div>
{% endblock %}


block函数

首先判断用户是否为admin,然后判断是否在block当前登陆的用户,再然后判断用户是否已经处于block状态,最后再更新数据库

@main.route('/blockuser/<username>', methods=['GET', 'POST'])
@login_required
def blockuser(username):
    if current_user.is_admin():
        user = WebUser.query.filter_by(username=username).first()
        if user.username == current_user.username:
            flash('Your can not block yourself')
            return redirect(url_for('main.userlist'))
        if user.is_block():
            user.block_status = False
            db.session.add(user)
            db.session.commit()
            flash('Have block this user')
            return redirect(url_for('main.userlist'))
        else:
            flash('This user have been blocked')
            return redirect(url_for('main.userlist'))
    flash('Your have no permission to operate it')
    return redirect(url_for('main.index'))

unblock函数类似,不再赘述,可以到我的源代码中查看具体实现。


页面演示


我将完整的代码上传到GitHub上了,有兴趣的同学可以戳这里:

https://github.com/zhouwei713/flask-webauth

另外还配置了一个演示web,地址为:

https://luobodazahui.top/

也可以点击“阅读原文”进入

感兴趣的同学可以来玩玩

相关文章
|
3月前
|
安全 数据安全/隐私保护 Python
基于Flask框架实现一个简易后台用户登录系统
基于Flask框架实现一个简易后台用户登录系统
96 1
|
4月前
|
数据采集 自然语言处理 数据可视化
优秀python系统案例】基于python Flask的电影票房数据爬取与可视化系统的设计与实现
本文介绍了一个基于Python Flask框架开发的电影票房数据爬取与可视化系统,该系统利用网络爬虫技术从豆瓣电影网站抓取数据,通过Python进行数据处理和分析,并采用ECharts等库实现数据的可视化展示,为电影行业从业者提供决策支持。
309 2
优秀python系统案例】基于python Flask的电影票房数据爬取与可视化系统的设计与实现
|
3月前
|
人工智能 安全 数据安全/隐私保护
基于Flask框架实现一个简易后台用户登录系统
基于Flask框架实现一个简易后台用户登录系统
59 0
|
4月前
|
数据采集 数据可视化 关系型数据库
【优秀python web设计】基于Python flask的猫眼电影可视化系统,可视化用echart,前端Layui,数据库用MySQL,包括爬虫
本文介绍了一个基于Python Flask框架、MySQL数据库和Layui前端框架的猫眼电影数据采集分析与可视化系统,该系统通过爬虫技术采集电影数据,利用数据分析库进行处理,并使用Echart进行数据的可视化展示,以提供全面、准确的电影市场分析结果。
150 4
|
4月前
|
机器学习/深度学习 数据采集 数据可视化
【优秀python系统毕设】基于Python flask的气象数据可视化系统设计与实现,有LSTM算法预测气温
本文介绍了一个基于Python Flask框架开发的气象数据可视化系统,该系统集成了数据获取、处理、存储、LSTM算法气温预测以及多种数据可视化功能,旨在提高气象数据的利用价值并推动气象领域的发展。
207 1
|
4月前
|
机器学习/深度学习 数据采集 存储
基于Python+flask+echarts的气象数据采集与分析系统,可实现lstm算法进行预测
本文介绍了一个基于Python、Flask和Echarts的气象数据采集与分析系统,该系统集成了LSTM算法进行数据预测,并提供了实时数据监测、历史数据查询、数据可视化以及用户权限管理等功能。
123 0
|
4月前
|
机器学习/深度学习 算法 数据可视化
基于Python flask的豆瓣电影数据分析可视化系统,功能多,LSTM算法+注意力机制实现情感分析,准确率高达85%
本文介绍了一个基于Python Flask框架的豆瓣电影数据分析可视化系统,该系统集成了LSTM算法和注意力机制进行情感分析,准确率高达85%,提供了多样化的数据分析和情感识别功能,旨在帮助用户深入理解电影市场和观众喜好。
146 0
|
19天前
|
JSON 前端开发 API
使用Python和Flask构建简易Web API
使用Python和Flask构建简易Web API
|
29天前
|
开发框架 前端开发 JavaScript
利用Python和Flask构建轻量级Web应用的实战指南
利用Python和Flask构建轻量级Web应用的实战指南
72 2
|
1月前
|
JSON API 数据格式
如何使用Python和Flask构建一个简单的RESTful API。Flask是一个轻量级的Web框架
本文介绍了如何使用Python和Flask构建一个简单的RESTful API。Flask是一个轻量级的Web框架,适合小型项目和微服务。文章从环境准备、创建基本Flask应用、定义资源和路由、请求和响应处理、错误处理等方面进行了详细说明,并提供了示例代码。通过这些步骤,读者可以快速上手构建自己的RESTful API。
38 2