相信用過Django框架的都不會忘記它強大的Admin功能,Flask-admin是一款能夠與Django Admin所媲美的擴展,能夠快速創建Web管理界面,實現了用戶、文件增刪改查等常用功能;也可以通過修改模板文件來定制管理頁面.
初始化:
from flask import Flask from flask_admin import Admin app = Flask(__name__) admin = Admin(app) # Add administrative views here #也可以指定name屬性來命名admin = Admin(app, name='Super Administrator') app.run()
Flask-admin將后台的每一個菜單選項看作一個View對象,View對象要通過flask-admin實例對象注冊后才能顯示
from flask_admin import Admin, BaseView, expose #繼承一個BaseView定義一項管理菜單 class MyView(BaseView): #127.0.0.1:5000/admin/ @expose('/') def index(self): return self.render('index.html') #添加一個Hello菜單,這個視圖可以在外部通過url_for('myview.index')生成url admin.add_view(MyView(name='Hello'))
#添加一個在Test標簽下添加一個Hello 1菜單,路由為test1 #這個視圖在外部通過url_for('test1.index')生成url admin.add_view(MyView(name='Hello 1', endpoint='test1', category='Test')) admin.add_view(MyView(name='Hello 2', endpoint='test2', category='Test')) admin.add_view(MyView(name='Hello 3', endpoint='test3', category='Test'))
效果如圖:
安全
flask-admin不提供后台的安全認證,默認情況下,管理界面是完全公開的,不過你可以自己實現認證的邏輯,或者使用flask-login提供的.在定義View時覆蓋父類的is_accessible()方法 ,返回False則禁止訪問
class MyView(BaseView): def is_accessible(self): return login.current_user.is_authenticated()
模型
flask-admin可以通過創建ModelView
類實例實現模型的管理
from flask.ext.admin.contrib.sqla import ModelView from .models import User # Flask and Flask-SQLAlchemy initialization here admin = Admin(app) admin.add_view(ModelView(User, db.session))
可以通過繼承ModelView來定制模型管理內容
from flask_admin.contrib.sqla import ModelView # Flask and Flask-SQLAlchemy initialization here class MyView(ModelView): # 是否允許創建 can_create = False # 顯示的字段 column_list = ('login', 'email') def __init__(self, session, **kwargs): # You can pass name and other parameters if you want to super(MyView, self).__init__(User, session, **kwargs) admin = Admin(app) admin.add_view(MyView(db.session))
1.指定可搜索的字段:
column_searchable_list = ('name', 'email') 或者column_searchable_list = (User.name, User.email)
2.指定過濾器:
column_filters = ('user', 'email') 或者
column_filters = (BooleanEqualFilter(User.name, 'Name'))
3.設置內聯對象:
時創建或修改時可以同時創建內聯對象,內聯對象必須是與這個對象建立了關系的.如圖,創建新用戶時可以同時創建他的文章,如圖
(1)inline_models = (Article,) 直接創建
(2)inline_models = [(Article, dict(form_columns=['title']))]指定內聯對象顯示的字段,這里只顯示title
(3)Django方式創建內聯對象:
class MyInlineModelForm(InlineFormAdmin): form_columns = ('title', 'date') class MyModelView(ModelView): inline_models = (MyInlineModelForm(MyInlineModel),)
文件管理
from flask.ext.admin.contrib.fileadmin import FileAdmin import os.path as op # Flask setup here admin = Admin(app) path = op.join(op.dirname(__file__), 'static') admin.add_view(FileAdmin(path, '/static/', name='Static Files'))