Flask擴展包之flask-admin


入門


初始化

第一步是為Flask應用初始化一個空的管理界面:

from flask import Flask from flask_admin import Admin app = Flask(__name__) admin = Admin(app, name='microblog', template_mode='bootstrap3') # Add administrative views here app.run() 

這里,nametemplate_mode參數都是可選的。或者,您可以使用該init_app()方法。

如果您啟動此應用程序並導航到http:// localhost:5000 / admin /,您應該會在頂部看到一個帶有導航欄的空白頁面。

添加模型視圖

模型視圖允許您添加一組專用管理頁面,用於管理數據庫中的任何模型。通過創建ModelView類的實例來執行此操作,您可以從Flask-Admin的內置ORM后端之一導入該類。一個例子是SQLAlchemy后端,您可以按如下方式使用它:

from flask_admin.contrib.sqla import ModelView # Flask and Flask-SQLAlchemy initialization here admin = Admin(app, name='microblog', template_mode='bootstrap3') admin.add_view(ModelView(User, db.session)) admin.add_view(ModelView(Post, db.session)) 

開箱即用,這為您的模型提供了一組功能齊全的CRUD視圖:

  • 一個列表視圖,用於搜索,排序,過濾和刪除記錄的支持。
  • 一個創建視圖添加新記錄。
  • 用於更新現有記錄編輯視圖。
  • 可選的只讀詳細信息視圖。

有許多選項可用於自定義這些內置視圖的顯示和功能。有關詳細信息,請參閱自定義內置視圖有關可用的其他ORM后端的更多詳細信息,請參閱使用不同的數據庫后端

向索引頁面添加內容

當你訪問http:// localhost:5000 / admin /時,你會注意到的第一件事 是它只是一個帶有導航菜單的空白頁面。要向此頁面添加一些內容,請在項目的templates目錄中將以下文本另存為admin / index.html

{% extends 'admin/master.html' %} {% block body %} <p>Hello world</p> {% endblock %} 

這將覆蓋默認索引模板,但仍會為您提供內置導航菜單。因此,現在您可以將任何內容添加到索引頁面,同時保持一致的用戶體驗。

授權和權限


為應用程序設置管理界面時,您要解決的首要問題之一是如何阻止不需要的用戶。使用Flask-Admin,有幾種不同的方法可以解決這個問題。

HTTP 

不幸的是,沒有簡單的方法可以將HTTP Basic Auth應用到您的管理界面。

最簡單的身份驗證形式是HTTP Basic Auth。它不會干擾您的數據庫模型,也不需要您編寫任何新的視圖邏輯或模板代碼。因此,在您希望全世界都能看到它之前,部署仍處於開發階段的內容時,這非常棒。

看看Flask-BasicAuth,看看將整個應用程序置於HTTP Basic Auth之后是多么容易。

滾動你自己

對於更靈活的解決方案,Flask-Admin允許您通過簡單地覆蓋is_accessible方法來定義每個管理視圖類的訪問控制規則您如何實現邏輯取決於您,但如果您使用像Flask-Login這樣的低級庫 ,則限制訪問可能非常簡單:

class MicroBlogModelView(sqla.ModelView): def is_accessible(self): return login.current_user.is_authenticated def inaccessible_callback(self, name, **kwargs): # redirect to login page if user doesn't have access return redirect(url_for('login', next=request.url)) 

在導航菜單中,不會為該用戶顯示特定用戶無法訪問的組件。有關在Flask-Admin中使用Flask-Login的示例,請查看https://github.com/flask-admin/Flask-Admin/tree/master/examples/auth-flask-login

主要缺點是您仍需要自己實現所有相關的登錄,注冊和帳戶管理視圖。

使用燒瓶安全

如果您想要更精細的解決方案,可以使用Flask-Security,這是一個更高級別的庫。它提供了許多內置視圖,用於執行用戶注冊,登錄,電子郵件地址確認,密碼重置等常見操作。

唯一復雜的一點是使內置的Flask-Security視圖與Flask-Admin模板順利集成,以創建一致的用戶體驗。為此,您需要覆蓋內置的Flask-Security模板,並通過在每個文件的頂部添加以下內容來擴展Flask-Admin基本模板:

{% extends 'admin/master.html' %} 

現在,您需要手動傳入Flask-Admin模板的一些上下文變量,以便在從Flask-Security視圖中調用它們時正確呈現。定義security_context_processor函數將為您解決此問題:

def security_context_processor(): return dict( admin_base_template=admin.base_template, admin_view=admin.index_view, h=admin_helpers, ) 

有關在Flask-Admin中使用Flask-Security的工作示例,請查看 https://github.com/flask-admin/Flask-Admin/tree/master/examples/auth

該示例僅使用內置寄存器登錄視圖,但您可以按照相同的方法來包含其他視圖,例如forgot_passwordsend_confirmation等。

自定義內置視圖


內置的ModelView類非常適合快速入門。但是,您需要配置其功能以適合您的特定型號。這是通過設置ModelView類中可用的配置屬性的值來完成的

要指定一些全局配置參數,可以將ModelView子類化,並在將模型添加到接口時使用該子類:

from flask_admin.contrib.sqla import ModelView # Flask and Flask-SQLAlchemy initialization here class MicroBlogModelView(ModelView): can_delete = False # disable model deletion page_size = 50 # the number of entries to display on the list view admin.add_view(MicroBlogModelView(User, db.session)) admin.add_view(MicroBlogModelView(Post, db.session)) 

或者,以同樣的方式,您可以一次為單個模型指定選項:

class UserView(ModelView): can_delete = False # disable model deletion class PostView(ModelView): page_size = 50 # the number of entries to display on the list view admin.add_view(UserView(User, db.session)) admin.add_view(PostView(Post, db.session)) 

ModelView配置屬性

有關已定義屬性的完整列表,請查看API文檔BaseModelView()以下是一些最常用的屬性:

禁用某些CRUD操作,請設置以下任何布爾參數:

can_create = False can_edit = False can_delete = False 

如果模型中有太多數據要顯示在列表視圖中,則可以通過設置添加只讀詳細信息視圖

can_view_details = True 

從列表視圖中刪除列很簡單,只需傳遞column_excludes_list參數的列名列表

column_exclude_list = ['password', ] 

為了使搜索欄,或將其用於過濾,指定列名的列表:

column_searchable_list = ['name', 'email'] column_filters = ['country'] 

要獲得更快的編輯體驗,請在列表視圖中啟用內聯編輯

column_editable_list = ['name', 'last_name'] 

或者,在列表頁面模態窗口中顯示添加和編輯表單,而不是專用的創建編輯頁面:

create_modal = True edit_modal = True 

您可以通過指定選擇選項列表來限制文本字段的可能值

form_choices = { 'title': [ ('MR', 'Mr'), ('MRS', 'Mrs'), ('MS', 'Ms'), ('DR', 'Dr'), ('PROF', 'Prof.') ] } 

要從創建和編輯表單中刪除字段

form_excluded_columns = ['last_name', 'email'] 

要指定WTForms字段參數

form_args = { 'name': { 'label': 'First Name', 'validators': [required()] } } 

或者,指定用於呈現這些字段WTForms小部件的參數

form_widget_args = { 'description': { 'rows': 10, 'style': 'color: black' } } 

當您的表單包含外鍵時,請通過ajax加載這些相關模型,使用:

form_ajax_refs = { 'user': { 'fields': ['first_name', 'last_name', 'email'], 'page_size': 10 } } 

要過濾通過ajax加載的結果,您可以使用:

form_ajax_refs = { 'active_user': QueryAjaxModelLoader('user', db.session, User, filters=["is_active=True", "id>1000"]) } 

內聯管理相關模型

inline_models = ['post', ] 

這些內聯表單可以自定義。查看API文檔 inline_models()

啟用模型視圖的csv導出

can_export = True 

這將向模型視圖添加一個按鈕,用於導出記錄,截斷為export_max_rows

添加自己的視圖


對於您的要求非常具體並且您很難通過內置ModelView來滿足它們的情況,Flask-Admin使您可以輕松地完全控制並將自己的視圖添加到界面中。

獨立視圖

可以通過擴展BaseView類並定義自己的視圖方法來添加一組獨立視圖(不依賴於任何特定模型) 例如,要添加顯示來自第三方API的某些分析數據的頁面:

from flask_admin import BaseView, expose class AnalyticsView(BaseView): @expose('/') def index(self): return self.render('analytics_index.html') admin.add_view(AnalyticsView(name='Analytics', endpoint='analytics')) 

這將為您的視圖添加指向導航欄的鏈接。請注意,它以“/”(根URL)提供。這是對獨立視圖的限制:至少每個視圖類至少需要一個方法來在其根目錄下提供視圖。

上面示例analytics_index.html模板可能如下所示:

{% extends 'admin/master.html' %} {% block body %} <p>Here I'm going to display some data.</p> {% endblock %} 

通過擴展admin / master.html模板,您可以保持一致的用戶體驗,即使在嚴格控制頁面內容的同時也是如此。

覆蓋內置視圖

在某些情況下,您可能需要大多數內置的ModelView功能,但您希望替換默認的創建編輯列表視圖之一。為此,您只能覆蓋有問題的視圖,並且它的所有鏈接仍將按預期運行:

from flask_admin.contrib.sqla import ModelView # Flask and Flask-SQLAlchemy initialization here class UserView(ModelView): @expose('/new/', methods=('GET', 'POST')) def create_view(self): """  Custom create view.  """ return self.render('create_user.html') 

使用內置模板


Flask-Admin使用Jinja2模板引擎。

擴展內置模板

而不是完全覆蓋內置模板,最好擴展它們。這將使您以后升級到新的Flask-Admin版本變得更加簡單。

在內部,Flask-Admin模板派生自admin / master.html模板。您可以擴展的三個最有趣的模板:

  • 管理/模型/ list.html
  • 管理/模型/ create.html上
  • 管理/模型/ edit.html

使用您自己的功能擴展默認編輯模板,請在templates / microblog_edit.html中創建一個模板, 如下所示:

{% extends 'admin/model/edit.html' %} {% block body %} <h1>MicroBlog Edit View</h1> {{ super() }} {% endblock %} 

現在,要使您的視圖類使用此模板,請設置適當的類屬性:

class MicroBlogModelView(ModelView): edit_template = 'microblog_edit.html' # create_template = 'microblog_create.html' # list_template = 'microblog_list.html' 

如果要使用自己的基本模板,請在初始化期間將模板名稱傳遞給admin構造函數:

admin = Admin(app, base_template='microblog_master.html') 

覆蓋內置模板

要完全控制管理界面的樣式和布局,您可以覆蓋所有內置模板。請記住,模板會從一個版本的Flask-Admin略微改變到下一個版本,所以一旦你開始覆蓋它們,你需要在升級包版本時要小心。

要覆蓋任何內置模板,只需將它們從Flask-Admin源復制到項目的templates / admin /目錄中。只要文件名保持不變,項目目錄中的模板應自動優先於內置模板。

可用的模板塊

Flask-Admin admin / master.html定義了一個基本模板,其中包含所有其他管理模板。此模板是指向admin / base.html的代理,它定義了以下塊:

阻止名稱 描述
head_meta 標題中的頁面元數據
標題 頁面標題
head_css 標題中包含各種CSS
HTML頭中的空塊,以防你想在那里放東西
page_body 頁面布局
菜單欄中的徽標
主菜單 主菜單
menu_links 鏈接菜單
訪問控制 菜單右側的部分(可用於添加登錄/注銷按鈕)
消息 提醒和各種消息
身體 內容(顯示視圖的位置)
尾巴 內容空白區域

除了從admin / master.html繼承的所有塊之外admin / model / list.html模板還包含以下塊:

阻止名稱 描述
model_menu_bar 菜單欄
model_list_table 表容器
list_header 表頭行
list_row_actions_header 動作標題
list_row 單排
list_row_actions 帶有編輯/刪除/等按鈕的行動單元格
empty_list_message 如果找不到模型,將顯示的消息

請查看https://github.com/flask-admin/flask-admin/tree/master/examples/layout上的布局示例, 了解如何對管理界面進行完整的風格控制。

環境變量

在擴展admin / master.html的任何模板中工作時,您可以訪問少量環境變量:

變量名 描述
admin_view 當前的管理視圖
admin_base_template 基本模板名稱
_gettext Babel gettext
_ngettext Babel ngettext
H 來自helpers模塊的助手

生成

要生成特定視圖的URL,請使用帶有點前綴的url_for

from flask import url_for class MyView(BaseView): @expose('/') def index(self): # Get URL for the test view method user_list_url = url_for('user.index_view') return self.render('index.html', user_list_url=user_list_url) 

還可以引用特定記錄:

# Edit View for record #1 (redirect back to index_view)
url_for('user.edit_view', id=1, url=url_for('user.index_view')) 

引用ModelView實例時,在調用url_for時使用模型的小寫名稱作為前綴可以通過為每個視圖指定唯一端點並將其用作前綴來引用其他視圖。所以,你可以使用:

url_for('analytics.index') 

如果您的視圖端點定義如下:

admin.add_view(CustomView(name='Analytics', endpoint='analytics'))

 

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM