目录

前文列表

用 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中文入门教程

Flask-Admin

现在 blog 项目的基本框架已经完成了, 但是还缺少一个像 WordPress 那样的后台管理界面. 这对许多 Web 应用来说都是必须的, Flask-Admin 能够帮助我们简单, 快捷的实现一个网站的后台管理.

  • 安装
  1. pip install Flask-Admin
  2. pip freeze > requirements.txt
  • 初始化 flask_admin 对象

    vim jmilkfansblog/extensions.py
  1. from flask.ext.admin import Admin
  2. #### Create the Flask-Admin's instance
  3. flask_admin = Admin()
  • 将 flask_admin 注册到 app 对象中
  1. from jmilkfansblog.extensions import restful_api, debug_toolbar, cache, flask_admin
  2. ...
  3. def create_app(object_name):
  4. """Create the app instance via `Factory Method`"""
  5. ...
  6. #### Init the Flask-Admin via app object
  7. 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
  1. from flask.ext.admin import BaseView, expose
  2. class CustomView(BaseView):
  3. """View function of Flask-Admin for Custom page."""
  4. @expose('/')
  5. def index(self):
  6. return self.render('admin/custom.html')
  7. @expose('/second_page')
  8. def second_page(self):
  9. return self.render('admin/second_page.html')

NOTE 1: 在 BaseView 的子类中可以定义若干个视图函数, 使用 Flask-Admin 的 @expose 装饰器来注册函数为视图, 这与一般的视图函数定义是有区别的.

NOTE 2: BaseView 子类必须定义一个路由 URL 为 / 的视图函数, 在 Admin 界面中只会默认显示该视图函数, 其他的视图函数是通过 / 中的链接来实现跳转的.

NOTE 3: exposeself.render 的使用方法与 blueprint.routerenter_template 的使用方法是一样的.

  • 实现了视图函数之后, 就要实现配套的 template 文件

    vim jmilkfansblog/templates/admin/custom.html
  1. {% extends 'admin/master.html' %}
  2. {% block body %}
  3. This is the custom view!
  4. <a href="{{ url_for('customview.second_page') }}">Link</a>
  5. {% endblock %}
  • 将 CustiomView 注册到 flask_admin 对象中
  1. def create_app(objet_name):
  2. ...
  3. #### Init the Flask-Admin via app object
  4. flask_admin.init_app(app)
  5. # Register view function `CustomView` into Flask-Admin
  6. 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 的子类
  1. from flask.ext.admin.contrib.sqla import ModelView
  2. class CustomModelView(ModelView):
  3. """View function of Flask-Admin for Models page."""
  4. pass
  • 注册 CustomModelView 对象到 flask_admin 对象

    vim jmilkfansblog/__init__.py
  1. from jmilkfansblog.models import db, User, Post, Role, Tag, BrowseVolume, Reminder
  2. from jmilkfansblog.controllers.admin import CustomView, CustomModelView
  3. def create_app(object_name):
  4. """Create the app instance via `Factory Method`"""
  5. ...
  6. #### Init the Flask-Admin via app object
  7. flask_admin.init_app(app)
  8. # Register view function `CustomView` into Flask-Admin
  9. flask_admin.add_view(CustomView(name='Custom'))
  10. # Register view function `CustomModelView` into Flask-Admin
  11. models = [Role, Tag, Reminder, BrowseVolume]
  12. for model in models:
  13. flask_admin.add_view(
  14. 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的更多相关文章

  1. 用 Flask 来写个轻博客

    用 Flask 来写个轻博客 用 Flask 来写个轻博客 (1) — 创建项目 用 Flask 来写个轻博客 (2) — Hello World! 用 Flask 来写个轻博客 (3) — (M)V ...

  2. 用 Flask 来写个轻博客 (37) — 在 Github 上为第一阶段的版本打 Tag

    Blog 项目源码:https://github.com/JmilkFan/JmilkFan-s-Blog 目录 目录 前文列表 第一阶段结语 打 Tag 前文列表 用 Flask 来写个轻博客 (1 ...

  3. 用 Flask 来写个轻博客 (36) — 使用 Flask-RESTful 来构建 RESTful API 之五

    目录 目录 前文列表 PUT 请求 DELETE 请求 测试 对一条已经存在的 posts 记录进行 update 操作 删除一条记录 前文列表 用 Flask 来写个轻博客 (1) - 创建项目 用 ...

  4. 用 Flask 来写个轻博客 (35) — 使用 Flask-RESTful 来构建 RESTful API 之四

    Blog 项目源码:https://github.com/JmilkFan/JmilkFan-s-Blog 目录 目录 前文列表 POST 请求 身份认证 测试 前文列表 用 Flask 来写个轻博客 ...

  5. 用 Flask 来写个轻博客 (34) — 使用 Flask-RESTful 来构建 RESTful API 之三

    目录 目录 前文列表 应用请求中的参数实现 API 分页 测试 前文列表 用 Flask 来写个轻博客 (1) - 创建项目 用 Flask 来写个轻博客 (2) - Hello World! 用 F ...

  6. 用 Flask 来写个轻博客 (33) — 使用 Flask-RESTful 来构建 RESTful API 之二

    Blog 项目源码:https://github.com/JmilkFan/JmilkFan-s-Blog 目录 目录 前文列表 扩展阅读 构建 RESTful Flask API 定义资源路由 格式 ...

  7. 用 Flask 来写个轻博客 (32) — 使用 Flask-RESTful 来构建 RESTful API 之一

    目录 目录 前文列表 扩展阅读 RESTful API REST 原则 无状态原则 面向资源 RESTful API 的优势 REST 约束 前文列表 用 Flask 来写个轻博客 (1) - 创建项 ...

  8. 用 Flask 来写个轻博客 (31) — 使用 Flask-Admin 实现 FileSystem 管理

    Blog 项目源码:https://github.com/JmilkFan/JmilkFan-s-Blog 目录 目录 前文列表 扩展阅读 编写 FileSystem Admin 页面 Flask-A ...

  9. 用 Flask 来写个轻博客 (30) — 使用 Flask-Admin 增强文章管理功能

    Blog 项目源码:https://github.com/JmilkFan/JmilkFan-s-Blog 目录 目录 前文列表 扩展阅读 实现文章管理功能 实现效果 前文列表 用 Flask 来写个 ...

随机推荐

  1. Entity Framework 中遇到的一些小问题

    一.在多表关联中,一个表中有另一个表的model累,在Include方法里提示lambda表达式不是委托类型,这时候需要using System.Data.Entity; 二.插入数据时,主键并非自增 ...

  2. STP基本概念及实验

    相关命令(华为交换机): stp enable(在交换机开启stp:stp使能) display stp 查看stp状态 stp mode stp/rstp/mstp  启用stp/rstp/mstp ...

  3. LOJ 2183 / SDOI2015 序列统计 (DP+矩阵快速幂)

    题面 传送门 分析 考虑容斥原理,用总的方案数-不含质数的方案数 设\(dp1[i][j]\)表示前i个数,和取模p为j的方案数, \(dp2[i][j]\)表示前i个数,和取模p为j的方案数,且所有 ...

  4. Python自学第二天学习之《列表》

    一.  列表:list类型,是有序的,可以被修改的. 格式 : li=["cd",1,"gfds",[1,2,3]] 1.类型转换: #字符串转换成列表 b=“ ...

  5. poj Meteor Shower

    这道题是下流星,流星会下到上下左右中的位置,而且有时间的,要你求出最短到达安全位置的时间. 这道题要注意边界是可以超过300的 #include<stdio.h> #include< ...

  6. 排序---快速排序及其切分函数Partition应用

    快速排序   快速排序通过一个切分元素将数组分成两个子数组,左子数组小于等于切分元素,右子数组大于切分元素,将这两个子数组排序,也就是将整个数组排序了. 代码如下: public class Sort ...

  7. mySql | Error: ER_DATA_TOO_LONG: Data too long for column 'base_info' at row 1

    问题描述:执行insert语句报以下错误 原因:数据库表,该字段在设计的时候长度过小,新插入的数据过长,会提示以上错误! 解决办法:修改表中该字段的长度限定.

  8. 使用MyEclipse创建Servlet

    https://www.yiibai.com/servlet/creating-servlet-in-myeclipse-ide.html 如何在myeclipse IDE中创建Servlet? 要在 ...

  9. 微信小程序(4)--二维码窗口

    微信小程序二维码窗口: <view class="btn" bindtap="powerDrawer" data-statu="open&quo ...

  10. 六、SQL语句进行多条件查询,并解决参数为空的情况

    一.SQL语句进行多条件查询,并解决参数为空的情况 QueryEntity query; var whereSql = new StringBuilder("Where 1=1") ...