1. 程式人生 > >用 Flask 來寫個輕部落格 (31) — 使用 Flask-Admin 實現 FileSystem 管理

用 Flask 來寫個輕部落格 (31) — 使用 Flask-Admin 實現 FileSystem 管理

目錄

前文列表

擴充套件閱讀

編寫 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 型別物件, 至於許可權的設定模式由我們自己定義.