用 Flask 来写个轻博客 (29) — 使用 Flask-Admin 实现后台管理 SQLAlchemy
目录
前文列表
用 Flask 来写个轻博客 (1) — 创建项目
用 Flask 来写个轻博客 (2) — Hello World!
用 Flask 来写个轻博客 (3) — (M)VC_连接 MySQL 和 SQLAlchemy
用 Flask 来写个轻博客 (4) — (M)VC_创建数据模型和表
用 Flask 来写个轻博客 (5) — (M)VC_SQLAlchemy 的 CRUD 详解
用 Flask 来写个轻博客 (6) — (M)VC_models 的关系(one to many)
用 Flask 来写个轻博客 (7) — (M)VC_models 的关系(many to many)
用 Flask 来写个轻博客 (8) — (M)VC_Alembic 管理数据库结构的升级和降级
用 Flask 来写个轻博客 (9) — M(V)C_Jinja 语法基础快速概览
用 Flask 来写个轻博客 (10) — M(V)C_Jinja 常用过滤器与 Flask 特殊变量及方法
用 Flask 来写个轻博客 (11) — M(V)C_创建视图函数
用 Flask 来写个轻博客 (12) — M(V)C_编写和继承 Jinja 模板
用 Flask 来写个轻博客 (13) — M(V)C_WTForms 服务端表单检验
用 Flask 来写个轻博客 (14) — M(V)C_实现项目首页的模板
用 Flask 来写个轻博客 (15) — M(V)C_实现博文页面评论表单
用 Flask 来写个轻博客 (16) — MV(C)_Flask Blueprint 蓝图
用 Flask 来写个轻博客 (17) — MV(C)_应用蓝图来重构项目
用 Flask 来写个轻博客 (18) — 使用工厂模式来生成应用对象
用 Flask 来写个轻博客 (19) — 以 Bcrypt 密文存储账户信息与实现用户登陆表单
用 Flask 来写个轻博客 (20) — 实现注册表单与应用 reCAPTCHA 来实现验证码
用 Flask 来写个轻博客 (21) — 结合 reCAPTCHA 验证码实现用户注册与登录
用 Flask 来写个轻博客 (22) — 实现博客文章的添加和编辑页面
用 Flask 来写个轻博客 (23) — 应用 OAuth 来实现 Facebook 第三方登录
用 Flask 来写个轻博客 (24) — 使用 Flask-Login 来保护应用安全
用 Flask 来写个轻博客 (25) — 使用 Flask-Principal 实现角色权限功能
用 Flask 来写个轻博客 (26) — 使用 Flask-Celery-Helper 实现异步任务
用 Flask 来写个轻博客 (27) — 使用 Flask-Cache 实现网页缓存加速
用 Flask 来写个轻博客 (28) — 使用 Flask-Assets 压缩 CSS/JS 提升网页加载速度
扩展阅读
Flask-Admin — flask-admin 1.4.2 documentation
Flask-Admin
现在 blog 项目的基本框架已经完成了, 但是还缺少一个像 WordPress 那样的后台管理界面. 这对许多 Web 应用来说都是必须的, Flask-Admin 能够帮助我们简单, 快捷的实现一个网站的后台管理.
- 安装
pip install Flask-Admin
pip freeze > requirements.txt
- 初始化 flask_admin 对象
vim jmilkfansblog/extensions.py
from flask.ext.admin import Admin
#### Create the Flask-Admin's instance
flask_admin = Admin()
- 将 flask_admin 注册到 app 对象中
from jmilkfansblog.extensions import restful_api, debug_toolbar, cache, flask_admin
...
def create_app(object_name):
"""Create the app instance via `Factory Method`"""
...
#### Init the Flask-Admin via app object
flask_admin.init_app(app)
这时, 我们只需要访问 http://localhost:5000/admin
就能够打开由 Flask-Admin 生成的后台界面了. 但是现在的管理界面是空白的, 需要我们自己去定义实现.
Flask-Admin 使用了一个简单而强大的概念 —— 管理部件(administrative pieces), 是一种使用视图函数构建的类, 所以也被称之为视图类, 主要有下列 3 种类型:
- ModelView: 模型视图
- FileAdmin: 本地文件系统管理
- BaseView: 基础视图
BaseView 基础管理页面
BaseView 能够生成最基本的视图, 并添加到 Admin 页面上, 如果你希望在 Admin 页面上加入一些 JavaScript 图表的话, 就可以使用 BaseView.
- 创建 BaseView 的子类
vim jmilkfansblog/controllers/admin.py
from flask.ext.admin import BaseView, expose
class CustomView(BaseView):
"""View function of Flask-Admin for Custom page."""
@expose('/')
def index(self):
return self.render('admin/custom.html')
@expose('/second_page')
def second_page(self):
return self.render('admin/second_page.html')
NOTE 1: 在 BaseView 的子类中可以定义若干个视图函数, 使用 Flask-Admin 的 @expose
装饰器来注册函数为视图, 这与一般的视图函数定义是有区别的.
NOTE 2: BaseView 子类必须定义一个路由 URL 为 /
的视图函数, 在 Admin 界面中只会默认显示该视图函数, 其他的视图函数是通过 /
中的链接来实现跳转的.
NOTE 3: expose
和 self.render
的使用方法与 blueprint.route
和 renter_template
的使用方法是一样的.
- 实现了视图函数之后, 就要实现配套的 template 文件
vim jmilkfansblog/templates/admin/custom.html
{% extends 'admin/master.html' %}
{% block body %}
This is the custom view!
<a href="{{ url_for('customview.second_page') }}">Link</a>
{% endblock %}
- 将 CustiomView 注册到 flask_admin 对象中
def create_app(objet_name):
...
#### Init the Flask-Admin via app object
flask_admin.init_app(app)
# Register view function `CustomView` into Flask-Admin
flask_admin.add_view(CustomView(name='Custom'))
NOTE 1: 不在 jmilkfansblog/extensions.py 中进行注册是因为在后续实现 ModelView 的时候, 会使用到 Model 对象, 然而在 jmilkfansblog/extensions.py 中导入 jmilkfansblog/models.py
的话很可能会造成循环导入, 所以就直接在 jmilkfansblog/__init__.py 中实现注册.
NOTE 2: add_view 的关键字参数 name 定义了在 Admin 页面的导航栏中该视图类对应的名字.
ModelView
ModelView 能够管理 SQLAlchemy Model, 提供一个 CRUD 的界面给我们使用.
- 定义 ModelView 的子类
from flask.ext.admin.contrib.sqla import ModelView
class CustomModelView(ModelView):
"""View function of Flask-Admin for Models page."""
pass
- 注册 CustomModelView 对象到 flask_admin 对象
vim jmilkfansblog/__init__.py
from jmilkfansblog.models import db, User, Post, Role, Tag, BrowseVolume, Reminder
from jmilkfansblog.controllers.admin import CustomView, CustomModelView
def create_app(object_name):
"""Create the app instance via `Factory Method`"""
...
#### Init the Flask-Admin via app object
flask_admin.init_app(app)
# Register view function `CustomView` into Flask-Admin
flask_admin.add_view(CustomView(name='Custom'))
# Register view function `CustomModelView` into Flask-Admin
models = [Role, Tag, Reminder, BrowseVolume]
for model in models:
flask_admin.add_view(
CustomModelView(model, db.session, category='Models'))
NOTE 1: ModelView 的构造器会接收 Model对象/session对象/category关键字参数 作为实参, 返回一个对象并注册到 flask_admin 后, 就能够在 Admin 界面上看见对 Modle 的管理页面.
NOTE 2: category 关键字参数会告诉 Flask-Admin 将拥有相同 category 值的对象放进同一个下拉框中. EG. 这里的 Role, Tag, Reminder, BrowseVolume 对象, 它们会出现在同一个下拉框中.
实现效果
下拉列表
查看 tags 数据表的数据记录
创建一条新的记录
修改一条旧的记录
删除一条记录
用 Flask 来写个轻博客 (29) — 使用 Flask-Admin 实现后台管理 SQLAlchemy的更多相关文章
- 用 Flask 来写个轻博客
用 Flask 来写个轻博客 用 Flask 来写个轻博客 (1) — 创建项目 用 Flask 来写个轻博客 (2) — Hello World! 用 Flask 来写个轻博客 (3) — (M)V ...
- 用 Flask 来写个轻博客 (37) — 在 Github 上为第一阶段的版本打 Tag
Blog 项目源码:https://github.com/JmilkFan/JmilkFan-s-Blog 目录 目录 前文列表 第一阶段结语 打 Tag 前文列表 用 Flask 来写个轻博客 (1 ...
- 用 Flask 来写个轻博客 (36) — 使用 Flask-RESTful 来构建 RESTful API 之五
目录 目录 前文列表 PUT 请求 DELETE 请求 测试 对一条已经存在的 posts 记录进行 update 操作 删除一条记录 前文列表 用 Flask 来写个轻博客 (1) - 创建项目 用 ...
- 用 Flask 来写个轻博客 (35) — 使用 Flask-RESTful 来构建 RESTful API 之四
Blog 项目源码:https://github.com/JmilkFan/JmilkFan-s-Blog 目录 目录 前文列表 POST 请求 身份认证 测试 前文列表 用 Flask 来写个轻博客 ...
- 用 Flask 来写个轻博客 (34) — 使用 Flask-RESTful 来构建 RESTful API 之三
目录 目录 前文列表 应用请求中的参数实现 API 分页 测试 前文列表 用 Flask 来写个轻博客 (1) - 创建项目 用 Flask 来写个轻博客 (2) - Hello World! 用 F ...
- 用 Flask 来写个轻博客 (33) — 使用 Flask-RESTful 来构建 RESTful API 之二
Blog 项目源码:https://github.com/JmilkFan/JmilkFan-s-Blog 目录 目录 前文列表 扩展阅读 构建 RESTful Flask API 定义资源路由 格式 ...
- 用 Flask 来写个轻博客 (32) — 使用 Flask-RESTful 来构建 RESTful API 之一
目录 目录 前文列表 扩展阅读 RESTful API REST 原则 无状态原则 面向资源 RESTful API 的优势 REST 约束 前文列表 用 Flask 来写个轻博客 (1) - 创建项 ...
- 用 Flask 来写个轻博客 (31) — 使用 Flask-Admin 实现 FileSystem 管理
Blog 项目源码:https://github.com/JmilkFan/JmilkFan-s-Blog 目录 目录 前文列表 扩展阅读 编写 FileSystem Admin 页面 Flask-A ...
- 用 Flask 来写个轻博客 (30) — 使用 Flask-Admin 增强文章管理功能
Blog 项目源码:https://github.com/JmilkFan/JmilkFan-s-Blog 目录 目录 前文列表 扩展阅读 实现文章管理功能 实现效果 前文列表 用 Flask 来写个 ...
随机推荐
- Yaconf – 一个高性能的配置管理扩展
鸟哥出品:http://www.laruence.com/2015/06/12/3051.html 首先说说, 这个是干啥的. 我见过很多的项目中, 用PHP文件做配置的, 一个config目录下可能 ...
- Python 学习笔记15 类 - 继承
我们在编程的过程中,并非都是要重头开始.比如其他人已经有现成的类,我们可以使用其他找人编写的类.术语称之为: 继承. 当一个类继承例外一个类时,它可以获得这个类的所有属性和方法:原有的类称之为 父类, ...
- CSS flex 布局学习笔记
写在前面 Flex 是 Flexible Box 的缩写,意为"弹性布局",用来为盒状模型提供最大的灵活性. 任何一个容器都可以指定为 Flex 布局. 采用 Flex 布局的元素 ...
- elasticsearch 深入 —— Scroll滚动查询
Scroll search 请求返回一个单一的结果"页",而 scroll API 可以被用来检索大量的结果(甚至所有的结果),就像在传统数据库中使用的游标 cursor. 滚动并 ...
- 2018-2-13-WPF-绑定密码
title author date CreateTime categories WPF 绑定密码 lindexi 2018-2-13 17:23:3 +0800 2018-2-13 17:23:3 + ...
- MyEclipse创建maven项目时报: org.apache.maven.archiver.MavenArchiver.getManifest 错误
创建项目报错,如图: 原因就是maven的配置文件不是最新的,MyEclipse2014解决方法: 1.help ->Install New sitie... 2.点击add 3.填写name和 ...
- 二、Ajax请求MVC中数据查询表返回datatable
一.Ajax请求MVC中数据查询表返回datatable 解决方式 返回list
- 关于TVS、ESD、稳压二极管、压敏电阻
一.稳压管和TVS管的工作原理 稳压二极管(又叫齐纳二极管),是一种直到临界反向击穿电压前都具有很高电阻的半导体器件,在这临界击穿点上,反向电阻降低到一个很小的数值,在这个低阻区中电流增加而电压则保持 ...
- HTML5:Canvas-基本用法
<canvas id="tutorial" width="150" height="150"></canvas> & ...
- java static在成员方法中
package java08; public class Myclass { int num;//成员变量 static int numStatic;//静态变量 //成员方法 public void ...