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 |
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')
flask_admin 笔记七 扩展功能的更多相关文章
- 《MFC游戏开发》笔记七 游戏特效的实现(一):背景滚动
本系列文章由七十一雾央编写,转载请注明出处. http://blog.csdn.net/u011371356/article/details/9344721 作者:七十一雾央 新浪微博:http:// ...
- (转)Qt Model/View 学习笔记 (七)——Delegate类
Qt Model/View 学习笔记 (七) Delegate 类 概念 与MVC模式不同,model/view结构没有用于与用户交互的完全独立的组件.一般来讲, view负责把数据展示 给用户,也 ...
- Learning ROS for Robotics Programming Second Edition学习笔记(七) indigo PCL xtion pro live
中文译著已经出版,详情请参考:http://blog.csdn.net/ZhangRelay/article/category/6506865 Learning ROS forRobotics Pro ...
- Elasticsearch笔记七之setting,mapping,分片查询方式
Elasticsearch笔记七之setting,mapping,分片查询方式 setting 通过setting可以更改es配置可以用来修改副本数和分片数. 1:查看,通过curl或浏览器可以看到副 ...
- Typescript 学习笔记七:泛型
中文网:https://www.tslang.cn/ 官网:http://www.typescriptlang.org/ 目录: Typescript 学习笔记一:介绍.安装.编译 Typescrip ...
- python3.4学习笔记(七) 学习网站博客推荐
python3.4学习笔记(七) 学习网站博客推荐 深入 Python 3http://sebug.net/paper/books/dive-into-python3/<深入 Python 3& ...
- Go语言学习笔记七: 函数
Go语言学习笔记七: 函数 Go语言有函数还有方法,神奇不.这有点像python了. 函数定义 func function_name( [parameter list] ) [return_types ...
- iOS 学习笔记七 【博爱手把手教你使用2016年gitHub Mac客户端】
iOS 学习笔记七 [博爱手把手教你使用gitHub客户端] 第一步:首先下载git客户端 链接:https://desktop.github.com 第二步:fork 大神的代码[这里以我的代码为例 ...
- 【opencv学习笔记七】访问图像中的像素与图像亮度对比度调整
今天我们来看一下如何访问图像的像素,以及如何改变图像的亮度与对比度. 在之前我们先来看一下图像矩阵数据的排列方式.我们以一个简单的矩阵来说明: 对单通道图像排列如下: 对于双通道图像排列如下: 那么对 ...
随机推荐
- go 实现简单的加权分配
最近一段时间接手了一个golang编写的模块,从python转到golang这种静态语言还是有些不适应的,接手模块后的第一个需求是实现一个加权分配的方法. 简单来说数据库中存有3个链接,3个链接的权重 ...
- MySQL5.7中的sql_mode默认值
简介 在正常项目开发过程中,如果MySQL版本从5.6升级到5.7版本.作为DBA在考虑数据库版本升级带来的影响时,一般会有几个注意点: sql_mode 默认值的改变 optimizer_switc ...
- 辽宁移动宽带体验及魔百盒M101s-2刷机
一.背景 坐标:辽宁 某城,移动宽带100M. 设备:移动赠送,华为光猫一只,魔百盒M101s-2电视盒子 一只,据安装人员说这个魔百盒是移动自己开发设计的. 二.上网体验 上网:浏览一般网站没问题. ...
- Docker学习—Docker简介
什么是Docker Docker 是一个开源项目,诞生于 2013 年初,最初是 dotCloud 公司内部的一个业余项目.它基于 Google 公司推出的 Go 语言实现. 项目后来加入了 Linu ...
- 怎样将本地web项目部署到腾讯云服务器上?
怎样将本地web项目部署到腾讯云服务器上? 1.本地计算机的工作: (1).用eclipse新建一个web项目,然后在webcontent下新建一个index.html,然后在本地部署到Tomcat服 ...
- <20180930>故障解决记录Cisco RV系列低端路由
故障描述: 今日网络瘫痪 , 浏览器提示报 DNS出错, 故障现象: 网关能正常分配到IP但内网机器却无法上网. 其中一个WiFi设备竟然还可以通讯(聊天工具)! 故障思路和排查: 1.1 怀疑是上次 ...
- hdu3400(三分套三分)
题意:平面上两条线段 AB,CD. A到B的速度v1,C到D的速度v2,其它地方的速度V3. 求A到D的最短时间. 解法:三分嵌套三分.首先假设AB上的点确定后.确定CD的点的确定应该是符合三分性质的 ...
- Java中关于AbstractQueuedSynchronizer的入门(二)
AQS是一个同步器的基础类,里面的关键字段: //如下关键字段都是volatile类型 /** * Head of the wait queue, lazily initialized. Except ...
- kafka libjvm 报错
kafka集群 kafka-0 出现报错信息 # # A fatal error has been detected by the Java Runtime Environment: # # SIGS ...
- QT 14 线程使用
1 线程基础 QThread 是对本地平台线程的一个非常好的跨平台抽象.启动一个线程非常简单.让我们看一段代码,它产生另一个线程,该线程打印hello,然后退出. // hellothread/hel ...