用 Flask 來寫個輕部落格 (31) — 使用 Flask-Admin 實現 FileSystem 管理
阿新 • • 發佈:2019-02-06
目錄
前文列表
擴充套件閱讀
編寫 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 型別物件, 至於許可權的設定模式由我們自己定義.