高階功能
1,開啟CSRF保護
要將CSRF保護新增到由ModelView例項生成的表單中,請通過指定form_base_class引數在ModelView子類中使用SecureForm類:
from flask_admin.form import SecureForm from flask_admin.contrib.sqla import ModelView class CarAdmin(ModelView): form_base_class = SecureForm
SecureForm需要WTForms 2或更高版本。 當表單提交時,它使用WTForms SessionCSRF類為您生成和驗證令牌。
通過有自定義Form提交的都要在form裡面加一個隱藏域 設定 name = csrf_token , value={{ csrf_token }}
否則會報csrf_token的錯誤!
2 使用Flask-Babelx來實現本地化
Flask-Admin附帶多種語言的翻譯。 啟用本地化很簡單:
1)安裝Flask-BabelEx來完成繁重的工作。 這是Flask-Babel軟體包的一個分支:
pip install flask-babelex
2)建立babel例項,並註冊到app中
from flask import app
from flask_babelex import Babel app = Flask(__name__)
babel = Babel(app)
3)選擇當地化的方言
@babel.localeselector
def get_locale():
if request.args.get('lang'):
session['lang'] = request.args.get('lang')
return session.get('lang', 'en') # en是預設方言
只能說這個東西不好用了 漢化不完整 如果要全域性設定可以在配置檔案里加:
BABEL_DEFAULT_LOCALE = 'zh_Hans_CN'
你也可以試著使用法語的方言,通過請求帶上本地化的引數:
http://localhost:5000/admin/?lang=fr.
繼續並將自己的邏輯新增到區域設定選擇器功能。 應用程式可以將語言環境儲存在使用者配置檔案,Cookie,會話等中。它還可以使用Accept-Language標題自動進行選擇。
如果內建的翻譯不夠,請檢視Flask-BabelEx文件以瞭解如何新增自己的翻譯。
3,管理檔案和資料夾
3.1 配置使用
要管理靜態檔案而不是資料庫記錄,Flask-Admin附帶了FileAdmin外掛。 它使您能夠上傳,刪除,重新命名等。您可以通過將FileAdmin檢視新增到您的應用程式來使用它:
from flask_admin.contrib.fileadmin import FileAdmin import os.path as op # Flask setup here admin = Admin(app, name='microblog', template_mode='bootstrap3') path = op.join(op.dirname(__file__), 'static')
admin.add_view(FileAdmin(path, '/static/', name='Static Files'))
FileAdmin還具有對位於Amazon Simple Storage Service儲存桶中的檔案進行管理的開箱即用的支援。 要將其新增到您的應用程式:
from flask_admin import Admin
from flask_admin.contrib.fileadmin.s3 import S3FileAdmin admin = Admin() admin.add_view(S3FileAdmin('files_bucket', 'us-east-1', 'key_id', 'secret_key')
您可以禁用上傳,禁用檔案刪除,限制檔案上傳到某些型別等。請檢查API文件中的flask_admin.contrib.fileadmin ======https://flask-admin.readthedocs.io/en/latest/api/mod_contrib_fileadmin/#module-flask_admin.contrib.fileadmin以獲取更多詳細資訊。
3.2 增加檔案管理後端
您也可以通過建立一個實現LocalFileStorage類中定義的相同方法的類來實現自己的儲存後端。 請在API文件中檢查flask_admin.contrib.fileadmin以獲取有關這些方法的詳細資訊。參考連結:https://flask-admin.readthedocs.io/en/latest/api/mod_contrib_fileadmin/#module-flask_admin.contrib.fileadmin
4,增加redis控制檯
另一個可用的外掛是Redis控制檯。 如果您的應用程式在同一臺計算機上執行Redis例項,則可以:
from redis import Redis
from flask_admin.contrib import rediscli # Flask setup here admin = Admin(app, name='microblog', template_mode='bootstrap3') admin.add_view(rediscli.RedisCli(Redis()))
5,替換單個表單域
form_overrides屬性允許您替換表單中的各個欄位。 一個常見的用例是新增一個你所看到的是什麼(WYSIWIGING)(WYSIWIG)編輯器,或者處理需要繫結到模型中的欄位的檔案/影象上載。
5.1 WYSIWIG文字域 處理
為了處理複雜的文字,可以使用WTForms的子類來驅動使用CKEditor富文字編輯器:
from wtforms import TextAreaField
from wtforms.widgets import TextArea class CKTextAreaWidget(TextArea):
def __call__(self, field, **kwargs):
if kwargs.get('class'):
kwargs['class'] += ' ckeditor'
else:
kwargs.setdefault('class', 'ckeditor')
return super(CKTextAreaWidget, self).__call__(field, **kwargs) class CKTextAreaField(TextAreaField):
widget = CKTextAreaWidget() class MessageAdmin(ModelView):
extra_js = ['//cdn.ckeditor.com/4.6.0/standard/ckeditor.js'] form_overrides = {
'body': CKTextAreaField
}
5.2 檔案和圖片域
Flask-Admin帶有一個內建的FileUploadField()和ImageUploadField()。 要使用它們,您需要指定一個上傳目錄並將它們新增到有問題的表單中。 如果您需要對影象檔案進行任何處理,影象處理也需要您安裝pillow。可以參考例子: https://github.com/flask-admin/Flask-Admin/tree/master/examples/forms.
如果您正在使用MongoEngine後端,Flask-Admin支援通過WTForms欄位的GridFS支援的影象和檔案上傳。 文件可以在flask_admin.contrib.mongoengine.fields找到。
如果您只想管理目錄中的靜態檔案,而不將它們繫結到資料庫模型,則使用File-Admin外掛:https://flask-admin.readthedocs.io/en/latest/advanced/#file-admin
6,通過渲染規則定製內建表單
在版本1.0.7之前,所有的模型後端都使用一個特殊的Jinja2巨集來渲染建立和編輯表單,這個巨集正在遍歷一個WTForms表單物件的欄位並逐一顯示。這很好,但很難定製。
從版本1.0.7開始,Flask-Admin支援表單呈現規則,使您能夠精細地控制應該如何顯示模組的表單。
基本的想法很簡單:可定製的渲染規則取代了一個靜態的巨集,所以你可以告訴Flask-Admin如何呈現每個表單。然而,作為一個擴充套件,渲染規則還可以讓你做更多的事情:你可以使用它們來輸出HTML,呼叫Jinja2巨集,渲染欄位等等。
實質上,表單呈現規則將表單呈現從表單定義中分離出來。例如,它不再關係你的表單欄位被定義在哪個序列中。
要開始使用表單呈現規則,請將表單欄位名稱列表放置到您的管理檢視之一的form_create_rules屬性中:
class RuleView(sqla.ModelView):
form_create_rules = ('email', 'first_name', 'last_name')
在這個例子中,只有三個欄位將被渲染,而email欄位將會在其他兩個欄位之上。
每當Flask-Admin在form_create_rules中看到一個字串值,它就會自動假定它是一個表單欄位引用,併為該欄位建立一個flask_admin.form.rules.Field類例項。
假設我們想在電子郵件和名字欄位之間顯示一些文字。 這可以通過使用flask_admin.form.rules.Text類來完成:
from flask_admin.form import rules class RuleView(sqla.ModelView):
form_create_rules = ('email', rules.Text('Foobar'), 'first_name', 'last_name')
內建規則:
Flask-Admin帶有幾個內建的規則,可以在flask_admin.form.rules模組中找到:
Form Rendering Rule |
Description |
All rules derive from this class |
|
Allows rule nesting, useful for HTML containers |
|
Simple text rendering rule |
|
Same as Text rule, but does not escape the text |
|
Calls macro from current Jinja2 context |
|
Wraps child rules into container rendered by macro |
|
Renders single form field |
|
Renders form header |
|
Renders form header and child rules |
7,不同的資料處理後端
除了SQLAlchemy ...有五種不同的後端供您選擇,具體取決於您希望用於應用程式的資料庫。 但是,如果您需要實現自己的資料庫後端,請檢視新增模型後端。
如果你不知道從哪裡開始,但是你熟悉關係資料庫,那麼你應該看看使用SQLAlchemy。 這是一個全功能的工具包,支援SQLite,PostgreSQL,MySQL,Oracle和MS-SQL等等。 一旦你有大量的資料,以及你的資料模型之間的相當數量的關係,它真的進入它自己。 如果你想跟蹤緯度/經度點等空間資料,你也應該看看GeoAlchemy。
SQLAlchemy
Notable features:
- SQLAlchemy 0.6+ support
- Paging, sorting, filters
- Proper model relationship handling
- Inline editing of related models
1)多主鍵key的支援
Flask-Admin對具有多個主鍵的模型提供有限的支援。 它只覆蓋了特定的情況,只有一個主鍵是另一個模型的外來鍵。 例如,遵循這個約定的模型繼承。
例子:tyres類
class Car(db.Model): __tablename__ = 'cars' id = db.Column(db.Integer, primary_key=True, autoincrement=True) desc = db.Column(db.String()) def __unicode__(self): return self.desc class Tyre(db.Model): __tablename__ = 'tyres' car_id = db.Column(db.Integer, db.ForeignKey('cars.id'), primary_key=True) tyre_id = db.Column(db.Integer, primary_key=True) car = db.relationship('Car', backref='tyres') desc = db.Column(db.String())
通過使用Tire類的兩個主鍵列來識別特定輪胎,其中car_id鍵本身就是Car類的外來鍵。
為了能夠刪除Tire類,需要在定義AdminView時列舉列:
class TyreAdmin(sqla.ModelView): form_columns = ['car', 'tyre_id', 'desc']
8,重寫表單的Scaffolding
如果您不想使用內建的Flask-Admin表單腳手架邏輯,您可以通過簡單重寫scaffold_form()來自由展開自己的腳步。 例如,如果您使用WTForms-Alchemy,則可以將您的表單生成程式碼放入ModelView類的scaffold_form方法中。
對於SQLAlchemy,如果synonym_property沒有返回SQLAlchemy欄位,那麼Flask-Admin將無法弄清楚如何處理它,所以它不會生成一個表單欄位。 在這種情況下,您需要手動提供您自己的欄位:
class MyView(ModelView): def scaffold_form(self): form_class = super(UserView, self).scaffold_form() form_class.extra = StringField('Extra') return form_class
9,批處理
如果要將其他批處理操作新增到列表檢視中,除了預設的刪除操作外,還可以定義一個實現所需邏輯的函式,並使用@action修飾器來包裝它。
動作裝飾器有三個引數:名稱,文字和確認。 雖然包裝函式應該只接受一個引數 - ids:
from flask_admin.actions import action class UserView(ModelView): @action('approve', 'Approve', 'Are you sure you want to approve selected users?') def action_approve(self, ids): try: query = User.query.filter(User.id.in_(ids)) count = for user in query.all(): if user.approve(): count += flash(ngettext('User was successfully approved.', '%(count)s users were successfully approved.', count, count=count)) except Exception as ex: if not self.handle_view_exception(ex): raise flash(gettext('Failed to approve users. %(error)s', error=str(ex)), 'error')