zoukankan      html  css  js  c++  java
  • 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')
  • 相关阅读:
    elasticsearch客户端连接选择
    logstash5.x配置
    git操作
    Linux的crontab
    让MySQL支持中文
    Python装饰器(decorator)
    Python类的探讨
    Python对象(译)
    Python基础-作用域和命名空间(Scope and Namespace)
    Python输入输出(IO)
  • 原文地址:https://www.cnblogs.com/minsons/p/8143961.html
Copyright © 2011-2022 走看看