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

目录

前文列表

用 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 来写个轻博客 (29) — 使用 Flask-Admin 实现后台管理 SQLAlchemy
用 Flask 来写个轻博客 (30) — 使用 Flask-Admin 增强文章管理功能

扩展阅读

[译]Flask-Admin中文入门教程

Flask-admin使用经验技巧总结

编写 FileSystem Admin 页面

所谓的 FileSystem Admin 功能, 就是哪呢钢构通过后台管理页面查看并修改 blog 项目中, 或自定义的文件目录内容. 使用 Flask-Admin 最后一种视图类型 FileAdmin 来实现.

这里写图片描述

从效果图中可以看见, 其中包括了 上传/创建目录/删除/重命名 等功能.

  • 继承 FileAdmin 视图类
    vim jmilkfansblog/controllers/admin.py
    最简单的实现方法, 只需要继承了 FileAdmin 类, 并且将子视图类添加到 flask_admin 对象中就可以了.
class CustomFileAdmin(FileAdmin):
    """File System admin."""
    pass
  • 添加到 flask_admin 对象
    该对象在之前的博文中已经定义过了
    vim jmilkfansblog/__init__.py
from jmilkfansblog/controllers import admin

    #### Init the Flask-Admin via app object
    flask_admin.init_app(app)
...
    # Register and define path of File System for Flask-Admin
    flask_admin.add_view(
        admin.CustomFileAdmin(
            os.path.join(os.path.dirname(__file__), 'static'),
            '/static',
            name='Static Files'))

NOTE: CustomFileAdmin 继承了 FileAdmin 的构造器, os.path.join(os.path.dirname(__file__), 'static') 的值为 你需要管理的文件目录在系统中的全路径. name 参数指定了在管理页面显示 Label 的名字.

Flask-Admin 的权限安全

一般的我们都不希望网站后台被匿名访问, 权限的设置是最基本的要求. 我们应该之前使用了 Flask-Login 来实现整个 blog 项目的权限功能模块, 所以我们直接引入到 Flask-Admin 就可以了.

  • 设置 CustomView 的限制
    vim jmilkfansblog/controllers/admin.py
from flask.ext.login import login_required, current_user
from jmilkfansblog.extensions import admin_permission

...
class CustomView(BaseView):
    """View function of Flask-Admin for Custom page."""

    @expose('/')
    @login_required
    @admin_permission.require(http_exception=403)
    def index(self):
        return self.render('admin/custom.html')

    @expose('/second_page')
    @login_required
    @admin_permission.require(http_exception=403)
    def second_page(self):
        return self.render('admin/second_page.html')

NOTE: 路由的访问限制我们直接使用 Flask-Login 提供的装饰器 @login-required 和之前定义好的 RoleNeed 对象来实现. 现在, 只有管理员用户处于登录状态时, 才能访问这个 URL .

  • 限制 ModelAdmin 和 FileAdmin
class CustomModelView(ModelView):
    """View function of Flask-Admin for Models page."""

    def is_accessible(self):
        """Setup the access permission for CustomModelView."""

        # callable function `User.is_authenticated()`.
        # FIXME(JMilkFan): Using function is_authenticated()
        return current_user.is_authenticated() and
            admin_permission.can()

class PostView(CustomModelView):
    """View function of Flask-Admin for Post create/edit Page includedin Models page"""

    # Using the CKTextAreaField to replace the Field name is `test`
    form_overrides = dict(text=CKTextAreaField)

    # Using Search box
    column_searchable_list = ('text', 'title')

    # Using Add Filter box
    column_filters = ('publish_date',)

    # Custom the template for PostView
    # Using js Editor of CKeditor
    create_template = 'admin/post_edit.html'
    edit_template = 'admin/post_edit.html'


class CustomFileAdmin(FileAdmin):
    """File System admin."""

    def is_accessible(self):
        """Setup the access permission for CustomFileAdmin."""

        # callable function `User.is_authenticated()`.
        return current_user.is_authenticated() and
            admin_permission.can()

NOTE 1: 设置 ModelAdmin 和 FileAdmin 子类的访问权限, 需要为它们定义一个 is_accessible() function, 并且返回的值必须为 Bool 类型对象, 至于权限的设置模式由我们自己定义.

原文地址:https://www.cnblogs.com/jmilkfan-fanguiju/p/7532256.html