高级功能

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

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

flask_admin 笔记七 扩展功能的更多相关文章

  1. 《MFC游戏开发》笔记七 游戏特效的实现(一):背景滚动

    本系列文章由七十一雾央编写,转载请注明出处. http://blog.csdn.net/u011371356/article/details/9344721 作者:七十一雾央 新浪微博:http:// ...

  2. (转)Qt Model/View 学习笔记 (七)——Delegate类

    Qt Model/View 学习笔记 (七) Delegate  类 概念 与MVC模式不同,model/view结构没有用于与用户交互的完全独立的组件.一般来讲, view负责把数据展示 给用户,也 ...

  3. Learning ROS for Robotics Programming Second Edition学习笔记(七) indigo PCL xtion pro live

    中文译著已经出版,详情请参考:http://blog.csdn.net/ZhangRelay/article/category/6506865 Learning ROS forRobotics Pro ...

  4. Elasticsearch笔记七之setting,mapping,分片查询方式

    Elasticsearch笔记七之setting,mapping,分片查询方式 setting 通过setting可以更改es配置可以用来修改副本数和分片数. 1:查看,通过curl或浏览器可以看到副 ...

  5. Typescript 学习笔记七:泛型

    中文网:https://www.tslang.cn/ 官网:http://www.typescriptlang.org/ 目录: Typescript 学习笔记一:介绍.安装.编译 Typescrip ...

  6. python3.4学习笔记(七) 学习网站博客推荐

    python3.4学习笔记(七) 学习网站博客推荐 深入 Python 3http://sebug.net/paper/books/dive-into-python3/<深入 Python 3& ...

  7. Go语言学习笔记七: 函数

    Go语言学习笔记七: 函数 Go语言有函数还有方法,神奇不.这有点像python了. 函数定义 func function_name( [parameter list] ) [return_types ...

  8. iOS 学习笔记七 【博爱手把手教你使用2016年gitHub Mac客户端】

    iOS 学习笔记七 [博爱手把手教你使用gitHub客户端] 第一步:首先下载git客户端 链接:https://desktop.github.com 第二步:fork 大神的代码[这里以我的代码为例 ...

  9. 【opencv学习笔记七】访问图像中的像素与图像亮度对比度调整

    今天我们来看一下如何访问图像的像素,以及如何改变图像的亮度与对比度. 在之前我们先来看一下图像矩阵数据的排列方式.我们以一个简单的矩阵来说明: 对单通道图像排列如下: 对于双通道图像排列如下: 那么对 ...

随机推荐

  1. JavaScript大杂烩10 - 理解DOM

    操作DOM 终于到了JavaScript最为核心的部分了,通常来说,操作DOM,为页面提供更为友好的行为是JavaScript根本目标.   DOM树 - HTML结构的抽象 既然DOM是操纵HTML ...

  2. EntityFramework Code-First 简易教程(十一)-------从已存在的数据库中映射出表

    怎样从一个已存在的数据库中映射表到 entity 实体? Entity Framework 提供了一个简便方法,可以为已存在的数据库里的所有表和视图创建实体类(entity class),并且可以用 ...

  3. Requests 校花网图片爬取

    纪念我们闹过的矛盾,只想平淡如水 import requestsimport reurl = 'http://www.xiaohuar.com/list-1-%s.html'for i in rang ...

  4. Mysql中use一个表出现警告:Reading table information for completion of table and column names You can turn off this feature to get a quicker startup with -A

    今天使用mysql登录数据库,use一个表的时候出现警告信息,详细如下: 后来上网查了一下,出现问题的原因是: 进入mysql时,没有使用  -A  参数 平时我们习惯使用:mysql -hhostn ...

  5. python最全学习资料:python基础进阶+人工智能+机器学习+神经网络(包括黑马程序员2017年12月python视频(百度云链接))

    首先用数据说话,看看资料大小,达到675G 承诺:真实资料.不加密,获取资料请加QQ:122317653 包含内容:1.python基础+进阶+应用项目实战 2.神经网络算法+python应用 3.人 ...

  6. January 18th, 2018 Week 03rd Thursday

    To strive, to seek, to find, and not to yield. 去奋斗,去寻觅,去探索,但绝不屈服. Strive for our dreams, seek the ve ...

  7. row_number() over() 一句话概括,以及max()函数的一种查询分组中最大值的用法

    row_number() over(partition by col1 order by col2) 根据COL1分组可能会有多个组,每组组内根据COL2进行排序.每组内都有自动生成的序号,从1开始, ...

  8. 【19】Linux系统知识点

    一.积跬步以致千里,积怠情以致深渊 二.目录结构

  9. do-while语句及for语句(初学者)

    1.do-while语句的一般形式为: do 语句 while(表达式): 这个循环与while循环的不同在于:它先执行循环中的语句,然后再判断这个表达式是否为真,如果为真则继续循环:如果为假,则中止 ...

  10. Sublime Text3如何快速预览html文件

    Sublime Text3 步骤1:选择 Tools----> Build System ----> New Build System... 步骤2:输入以下内容 "cmd&qu ...