您的位置:首页 > 编程语言 > Python开发

使用Python+Flask+Bootstrap实现一个简单的用户权限管理(RBAC)(Part3)

2020-06-06 05:38 411 查看

代码结构和说明

在第一章节中我列出了所有文件,本章我将会介绍所有的文件。

根目录

  1. db_design.txt
    这是初始化数据库的sql脚本,在tool_portal目录下面有一个user.sqlite,这个文件就是由这个初始化脚本生成的。初始化脚本包括一系列的sql语句。如:
    a) 建立用户表users,包括一个自动生成且唯一的userid,用户名username,用户的角色userrole,用户密码password
    b) 建立角色表roles,包括一个自动生成且唯一的roleid,角色的名字rolename
    c) 建立菜单表menu,包括一个自动生成且唯一的menuid,菜单名字menuname,菜单的父菜单parentmenu,菜单的顺序menuorder
    d) 建立角色映射菜单rolemapping,包括包括一个自动生成且唯一的mappingid,角色roleid,和菜单menuid

具体的sql语句如下

CREATE TABLE users (userid INTEGER PRIMARY KEY AUTOINCREMENT, username TEXT NOT NULL DEFAULT (null) ,userrole Integer,password text);
CREATE TABLE roles (roleid INTEGER PRIMARY KEY AUTOINCREMENT, rolename TEXT NOT NULL DEFAULT (null));
CREATE TABLE menus (menuid INTEGER PRIMARY KEY AUTOINCREMENT, menuname TEXT NOT NULL DEFAULT (null) ,parentmenu integer, menuorder INTEGER);
CREATE TABLE rolemappings (mappingid INTEGER PRIMARY KEY AUTOINCREMENT, roleid INTEGER, menuid INTEGER);

当表格建立完毕后,我们会增加一些默认值进入菜单中,包括
a) 在roles表中增加三个角色,admin, support, sales
b) 在users表中增加一个admin用户,密码是Password123!
c) 在menus表中增加两个父菜单supportmenu和salesmenu,同时给他们增加各两个子菜单supportsubmenu1/2 和salessubmenu1/2
具体sql语句如下

insert into roles(rolename) values('admin');
insert into roles(rolename) values('support');
insert into roles(rolename) values('sales');

insert into users(username,userrole,password) values ('admin',1,'63c9c7ffffcae785a032832c03cf0c79da5d5789b6a152aa49751b65');

insert into menus (menuname,menuorder) values ("supportmenu",1);
insert into menus (menuname,menuorder) values ("salesmenu",2);
insert into menus (menuname,parentmenu,menuorder) values ("supportsubmenu1",1,1);
insert into menus (menuname,parentmenu,menuorder) values ("supportsubmenu2",1,2);
insert into menus (menuname,parentmenu,menuorder) values ("salessubmenu1",2,1);
insert into menus (menuname,parentmenu,menuorder) values ("salessubmenu2",2,2);
  1. run.py
    主程序,通过运行这个程序来启动webserver。从源程序可以看到,我们从flask中引入了Flask和render_template,同时在tool_portal下引入了app,然后再从views中引入了login
    最后程序在5000端口启动
#!/usr/bin/env python
from flask import Flask,render_template
from tool_portal import app
import os

app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = True
app.config['SECRET_KEY'] = os.urandom(24)

from tool_portal.views import login
app.register_blueprint(login.bp)
app.add_url_rule("/", endpoint="login.login")

@app.route('/', methods=['GET', 'POST'])
def index():
return render_template('index.html')

app.run(host='0.0.0.0',port=5000,debug=True)

tool_portal

程序目录,所有的实际程序都在这个目录中执行

init.py

程序初始化文件,生成app并给根目录调用,主要目的是为了让根目录可以支持多个类似应用,比如本目录叫tool_portal,还可以建立平行的目录too_portal_1/2/3等

#!/usr/bin/env python
from flask import Flask
from flask_sqlalchemy import SQLAlchemy

def create_app():
app = Flask(__name__)
return app

app=create_app()

model.py

数据库映射,将我们前面建立的数据库映射到程序中来,这样程序就好操作数据库了。

from flask_sqlalchemy import SQLAlchemy
from tool_portal import app
import os

USERDBPATH='sqlite:///users.sqlite'
app.config['SQLALCHEMY_BINDS'] = {'userdb':USERDBPATH}
dbusers=SQLAlchemy(app)

class USERS(dbusers.Model):
__bind_key__ = 'userdb'
__tablename__ = 'users'
userid = dbusers.Column(dbusers.Integer, primary_key=True)
username = dbusers.Column(dbusers.Text, nullable=False)
userrole = dbusers.Column(dbusers.Integer)
password=dbusers.Column(dbusers.Text)

class ROLES(dbusers.Model):
__bind_key__ = 'userdb'
__tablename__ = 'roles'
roleid = dbusers.Column(dbusers.Integer, primary_key=True)
rolename = dbusers.Column(dbusers.Text, nullable=False)

class MENUS(dbusers.Model):
__bind_key__ = 'userdb'
__tablename__ = 'menus'
menuid = dbusers.Column(dbusers.Integer, primary_key=True)
menuname = dbusers.Column(dbusers.Text, nullable=False)
parentmenu = dbusers.Column(dbusers.Integer, nullable=False)
menuorder = dbusers.Column(dbusers.Integer, nullable=False)

class ROLEMAPPINGS(dbusers.Model):
__bind_key__ = 'userdb'
__tablename__ = 'rolemappings'
mappingid=dbusers.Column(dbusers.Integer,primary_key=True)
roleid = dbusers.Column(dbusers.Integer,nullable=False)
menuid = dbusers.Column(dbusers.Integer, nullable=False)

static

静态文件库,下面包括两个文件夹,CSS和JS,这两个文件夹里面的文件都是Bootstrap和jquery提供的,我们直接使用即可,不多做描述

├── static
│   ├── css
│   │   ├── bootstrap.min.css
│   │   └── signin.css
│   └── js
│       ├── bootstrap.min.js
│       └── jquery-3.4.1.min.js

templates

html模板文件,也就是我们能从浏览器上看到的内容,这些文件的关键地方可能会根据内容不同被替换掉,从而使得每个用户看到的内容不一样。

views

动态文件,也就是python功能脚本所在的位置,本文我们只有一个文件login.py

user.sqlite

数据库文件,这是一个sqlite3的本地数据库文件,具体怎么初始化这个数据库在根目录下的db_design.txt已经做了详细说明,关于如何连接和操作这个数据库,在model.py也做了说明

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐