基于Flask实现后台权限管理系统 - Flask

1. Flask

1.1. 简介

Flask是使用Python编写的轻量级Web应用框架,其WSGI工具箱采用Werkzeug,模板引擎则使用Jinja2。Flask使用BSD授权,Flask也被称为“microframework”,因为它使用简单的核心,用extension增加其他功能,用户可以随意地进行组合,满足自己的要求。

一段最简单的Flask代码如下:

 1 from flask import Flask
 2
 3 app = Flask(__name__)
 4
 5
 6
 7 @app.route(‘/‘)
 8
 9 def hello_world():
10
11     return ‘Hello World!‘
12
13
14
15 if __name__ == ‘__main__‘:
16
17     app.run()

那么,这段代码做了什么?

首先,我们导入了Flask类。这个类的实例将会是我们的WSGI应用程序。

接下来,我们创建一个该类的实例,第一个参数是应用模块或者包的名称。 如果你使用单一的模块(如本例),你应该使用__name__,因为模块的名称将会因其作为单独应用启动还是作为模块导入而有不同( 也即是 ‘__main__‘ 或实际的导入名)。这是必须的,这样 Flask才知道到哪去找模板、静态文件等等。详情见Flask的文档。

然后,我们使用route()装饰器告诉Flask什么样的URL能触发我们的函数。

这个函数的名字也在生成URL时被特定的函数采用,这个函数返回我们想要显示在用户浏览器中的信息。

最后我们用run()函数来让应用运行在本地服务器上。 其中if __name__ == ‘__main__‘: 确保服务器只会在该脚本被Python解释器直接执行的时候才会运行,而不是作为模块导入的时候。

1.2. Flask-SQLAlchemy

Flask-SQLAlchemy是对Flask的一个插件,是Flask对SQLAlchemy的封装,SQLAlchemy提供非常强大ORM(Object Relation Model 对象关系模型)功能。

常见情况下对于只有一个Flask应用,所需要做的事情就是创建Flask应用,选择加载配置,接着创建SQLAlchemy对象时候,把Flask应用传递给它作为参数。

一旦创建,这个对象就包含 sqlalchemy 和 sqlalchemy.orm 中的所有函数和助手。此外它还提供一个名为 Model 的类,用于作为声明模型时的 delarative 基类:

 1 class User(db.Model):
 2
 3   id = db.Column(db.Integer, primary_key=True)
 4
 5   username = db.Column(db.String(80), unique=True)
 6
 7
 8
 9   def __init__(self, username, email):
10
11     self.username = username
12
13
14
15   def __repr__(self):
16
17     return‘<User %r>‘ % self.username

1.2.1. 一对多关系

以资源类型和资源举例说明,它们之间关系是一对多关系,一个资源类型下可以有多个资源,而资源只属于一种类型,如果前面介绍,资源只能是菜单类型或功能类型的一种。

 1 class ResourceType(db.Model):
 2
 3   __tablename__ = ‘SYRESOURCETYPE‘
 4
 5   ID = db.Column(db.String(36), primary_key=True)
 6
 7   CREATEDATETIME = db.Column(db.DateTime, index=True, default=datetime.now)
 8
 9   UPDATEDATETIME = db.Column(db.DateTime, index=True, default=datetime.now)
10
11   NAME = db.Column(db.String(100))
12
13   DESCRIPTION = db.Column(db.String(200))
14
15   resources = db.relationship(‘Resource‘, backref=‘type‘, lazy=‘dynamic‘)
 1 class Resource(db.Model):
 2
 3     __tablename__ = ‘SYRESOURCE‘
 4
 5     ID = db.Column(db.String(36), primary_key=True)
 6
 7     # 省略部分内容
 8
 9     NAME = db.Column(db.String(100))
10
11     SYRESOURCETYPE_ID = db.Column(db.String, db.ForeignKey(‘SYRESOURCETYPE.ID‘))

ResourceType类通过relationship关联到Resource类,给自己定义了resources集合属性,代表本类型下的所有资源。db.relationship关联到Resource类,通过backref动态地给Resource类增加了type属性,代表Resource所属的资源类型。

1.2.2. 多对多关系

以用户和角色为例,它们之间的关系是多对多关系,一个用户可以有多个角色,一个角色也可以被多个用户所用。

user_role_table = db.Table(‘SYUSER_SYROLE‘, db.Model.metadata

, db.Column(‘SYUSER_ID‘, db.String, db.ForeignKey(‘SYUSER.ID‘))

, db.Column(‘SYROLE_ID‘, db.String, db.ForeignKey(‘SYROLE.ID‘)))

 1 class User(db.Model):
 2
 3     __tablename__ = ‘SYUSER‘
 4
 5     ID = db.Column(db.String(36), primary_key=True)
 6
 7     LOGINNAME = db.Column(db.String(100), unique=True, index=True)
 8
 9     PWD = db.Column(db.String(100))
10
11     NAME = db.Column(db.String(100))
12
13
14
15     roles = db.relationship(‘Role‘,secondary=user_role_table,
16
17     backref=db.backref(‘users‘, lazy=‘dynamic‘))
1 class Role(db.Model):
2
3     __tablename__ = ‘SYROLE‘
4
5     ID = db.Column(db.Integer, primary_key=True)
6
7     NAME = db.Column(db.String(100))

User类中通过db.relationship定义了和Role类之间的关系,它们之间连接的桥梁就是user_role_table,user_role_table定义了两张关联表之间主键的对应关系。User对象含有roles集合属性,代表角色的集合,而通过backref动态地给Role对象增加了users属性,代表本角色所从属的用户有哪些。

注:ORM将对象映射到数据表,对象之间的关系映射到表之间的关系,通过操作对象及其之间的关系即可以操作数据库表,非常方便,不需要写SQL语句。

1.3. 集成Python Shell

Flask-Script的shell命令可以导入指定的对象,这样就可以在控制台操作Python对象,譬如用户对象、资源对象等等,即时测试对象的属性和方便,使用起来比较方便。

 1 ###########################manager.py####################
 2
 3 from app.models import User, Role, Resource, ResourceType, Organization
 4
 5 from flask_script import Manager, Shell
 6
 7 from flask_migrate import Migrate, MigrateCommand
 8
 9
10
11 def make_shell_context():
12
13     return dict(app=app, db=db, User=User, Role=Role, Resource=Resource,
14
15 ResourceType=ResourceType, Organization=Organization)
16
17
18
19 manager.add_command("shell", Shell(make_context=make_shell_context))
20
21 manager.add_command(‘db‘, MigrateCommand)
22
23
24
25 @manager.command
26
27 def myprint():
28
29     print ‘hello world‘

代码使用flask_script下的Manager模块,通过add_command方法将一些对象注册到shell上下文中。注册的方法有两种:

1)add_command。直接调用Manager模块下的add_command方法;

> python manager.py shell

>>> db

<SQLAlchemy engine=‘mysql://root:@127.0.0.1/authbase?charset=utf8‘>

>>> app

<Flask ‘app‘>

>>> User.query.all()

[<User u‘\u8d85\u7ea7\u7ba1\u7406\u5458‘>

, <User u‘\u7ba1\u7406\u5458‘>

]

>>>

2)装饰器方式。使用manager.command装饰器,装饰的方法名称就会成为shell环境中的一条命令。

python manager.py myprint

hello world

1.4. 蓝图

蓝图实现了应用的模块化,使用蓝图使得应用层次更加清楚,开发者可以更容易地开发和维护项目。蓝图通常作用于相同的URL前缀,譬如/admin/user, /admin/resource等等,将一类相同的功能组合到一起,如果URL前缀发生变化,只需要修改蓝图即可。

举例说明,通常网站分为用户网站部分和管理后台部分,如博客类网站,管理后台可以编辑文章等操作,编辑后的文章会在用户网站部分显示,其它用户可以阅读、评论等,同时,管理后台可以评论进行管理等等。按照模块划分:

Blog -------|

| 前台网站

------------|app/blog/:id

------------|app/blog/:id/comment/:id

| 管理后台

|admin/user/:id

|admin/role/:id

|admin/siteinfo

上述Blog将网站分为两个部分:前台网站和管理后台,如果按照蓝图实现,即将应用划分为两个蓝图。

 1 from flask import Blueprint
 2
 3 app  = Blueprint(‘app‘, __name__, url_prefix=‘/app‘)
 4
 5 admin = Blueprint(‘admin‘, __name__, url_prefix=‘/admin‘)
 6
 7
 8
 9 @app.route(‘/blog/:id‘, methods=[‘POST‘])
10
11 defapp_blog():
12
13     #查询指定编号博客赋值给blog对象
14
15     returnrender_template(blog/index.html‘, blog=blog)
16
17
18
19 @admin.route(‘/role/:id‘, methods=[‘POST‘])
20
21 defadmin_role():
22
23      #查询指定编号角色赋值给role对象
24
25     return render_template(role/index.html‘, role=role)
时间: 2024-10-20 05:37:43

基于Flask实现后台权限管理系统 - Flask的相关文章

基于Flask实现后台权限管理系统 - 汇总

基于Flask实现后台权限管理系统 - 导言 基于Flask实现后台权限管理系统 - 高清图 基于Flask实现后台权限管理系统 - Flask 基于Flask实现后台权限管理系统 - 表设计 基于Flask实现后台权限管理系统 - 更多内容

基于Flask实现后台权限管理系统 - 高清图

主要描述如何基于Python的Flask WEB框架实现后台权限管理系统,内容包含:用户管理.角色管理.资源管理和机构管理.

基于Flask实现后台权限管理系统 - 表设计

1.1. 设计 1.1.1. 用户表 用户表记录系统中的所有用户,是权限管理系统最基本的部分,和其他权限表都有一定的关联关系,同时,一个还有一个重要的功能:系统登陆. 名称 数据类型 允许空值 默认值 描述 ID VARCHAR 否 无默认值 唯一编号 AGE INT 是 NULL 年龄 LOGINNAME VARCHAR 否 无默认值 登陆名称 NAME VARCHAR 是 NULL 昵称 PWD VARCHAR 是 NULL 密码,MD5加密 CREATEDATETIME DATETIME

基于Flask实现后台权限管理系统 - 导言

网上有这样一个段子,在评论语言好坏的时候,都会有人评论说PHP是世界上最好的语言,人生苦短我用Python,这里姑且不去评论语言的好坏,每一个语言存在都有它的价值,譬如C语言适合底层开发,整个Linux操作系统几乎都是用C语言开发的,而像Go语言适合高并发的网络开发一样,并不是说像Go干不了其它事情,只是更适合某种应用场景.谈到python之美,我认为这里有两个流派:python和pythonic.在我理解,Pythonic 就是很Python的Python代码,也就是用非常优美的python代

jfinal3.0+easyui1.4.4后台权限管理系统 [2017.2.11 更新]

本程序是基于最新的jfinal3.0+easyui1.4.4搭建的后台权限管理系统MYSQL版,包括选项数据字典.层级数据字典.部门管理.菜单管理.角色管理.用户管理.日志管理,既适合新手学习,也适合在此基础上开始您的应用程序开发旅程. 本程序是店家一直在更新完善并在生产环境中使用的版本,赢利不是我的目的,您的购买是我继续坚持改善和完善后台权限管理系统的动力.你可以关注作者的博客:http://lionkas.blog.51cto.com/ 获取到最新版本的更新信息. https://lionk

jfinal2.2+easyui1.4.4后台权限管理系统 [2016.05.27 更新]

我的主页:http://www.mxtt.cc    QQ:303629685

【Lazy1.1 权限管理系统 】2018年06月06 日发布

本程序是基于最新的jfinal3.4+easyui1.5.2搭建的后台权限管理系统MYSQL版,包括选项数据字典.层级数据字典.部门管理.菜单管理.角色管理.用户管理.日志管理,既适合新手学习,也适合在此基础上开始您的应用程序开发旅程. 演示站点: http://admin.lazy.kim 登录账号: admin 登录密码: admin 原文地址:http://blog.51cto.com/lionkas/2125766

如何在通用权限管理系统中集成log4net日志功能

开发人员都知道,在系统运行中要记录各种日志,自己写一个日志功能,无论是在效率还是功能扩展上来说都不是很好,目前大多用的是第三方的日志系统,其中一个非常有名,用的最多的就是log4net.下面是关于这个组件的介绍 ”Log4net是基于.net开发的一款非常著名的记录日志开源组件.最早是2001年7月由NeoWorks Limited启动的项目,基本的框架源, 于另外的一个非常著名的姐妹组件-log4j.现由Apache组织开发与维护.此日志架构是可灵活扩展,且通过配置文件来设置日志的属性及输出,

Asp.Net MVC4+EF6 Code First 权限管理系统 源码下载

这个权限管理系统是基于在@TZHSWEET 的权限管理系统之上做的修改.@TZHSWEET 那个是DB first. 这个是Code First.源码下载:http://download.csdn.net/detail/wode551120/7280559 http://pan.baidu.com/s/1o6uM2Ae 具体设计思路请参考@TZHSWEET  文章. 项目运行: 1.修改web.config 数据库连接 2.修改Global.asax Application_start方法中.取