Blog 项目源码:
目录
前文列表
扩展阅读
编写 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_userfrom 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 类型对象, 至于权限的设置模式由我们自己定义.