flask_admin 筆記七 擴展功能


高級功能

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

flask_admin.form.rules.BaseRule

All rules derive from this class

flask_admin.form.rules.NestedRule

Allows rule nesting, useful for HTML containers

flask_admin.form.rules.Text

Simple text rendering rule

flask_admin.form.rules.HTML

Same as Text rule, but does not escape the text

flask_admin.form.rules.Macro

Calls macro from current Jinja2 context

flask_admin.form.rules.Container

Wraps child rules into container rendered by macro

flask_admin.form.rules.Field

Renders single form field

flask_admin.form.rules.Header

Renders form header

flask_admin.form.rules.FieldSet

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(50))

 

    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(50))

通過使用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 = 0

            for user in query.all():

                if user.approve():

                    count += 1

 

            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')

 


免責聲明!

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



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