个人技术总结——Flask-Admin扩展

hzyuhz 2020-06-25

一、技术概述

Flask-Admin是一个功能齐全、简单易用的Flask扩展,可以为Flask应用程序增加管理界面。用这样一种方式实现管理后台,开发者拥有应用程序的外观和功能的全部控制权。

二、技术详述

这个库使用一个简单而强大的概念——管理部件,是用视图方法构建的类:

class MyView(BaseView):
    @expose(‘/‘)
    def index(self):
        return self.render(‘admin/myindex.html‘)

    @expose(‘/test/‘)
    def test(self):
        return self.render(‘admin/test.html‘)

如果用户访问index视图,模板文件admin/myindex.html会被渲染。同样的,访问test视图的结果是admin/test.html被渲染。

  • 初始化

要开始使用Flask-Admin,需要创建一个Admin类实例并和Flask应用程序实例关联。

from flask import Flask
from flask.ext.admin import Admin

app = Flask(__name__)

admin = Admin(app)
# Add administrative views here

app.run()
  • 增加视图

增加一个衍生于BaseView类的管理视图:

from flask import Flask
from flask.ext.admin import Admin, BaseView, expose

class MyView(BaseView):
    @expose(‘/‘)
    def index(self):
        return self.render(‘index.html‘)

app = Flask(__name__)

admin = Admin(app)
admin.add_view(MyView(name=‘Hello‘))

app.run()
  • 身份验证

Flask-Admin默认管理界面是完全开放的,要控制使用管理界面,可以指定is_accessible方法:

class MyView(BaseView):
    def is_accessible(self):
        return login.current_user.is_authenticated()
  • 生成URL

在内部,视图类工作于Flask蓝图的顶部,因此可以使用url_for附带一个.前缀来获得局部视图的URL:

from flask import url_for

class MyView(BaseView):
    @expose(‘/‘)
    def index(self)
        # Get URL for the test view method
        url = url_for(‘.test‘)
        return self.render(‘index.html‘, url=url)

    @expose(‘/test/‘)
    def test(self):
        return self.render(‘test.html‘)
  • 模型视图

模型视图允许你为数据库中的每个模型增加专用的管理页面。通过创建ModelView类实例来实现,ModelView类可从Flask-Admin内置的ORM后端引入。一个SQLAlchemy后端的例子:

from flask.ext.admin.contrib.sqla import ModelView

# Flask and Flask-SQLAlchemy initialization here

admin = Admin(app)
admin.add_view(ModelView(User, db.session))

三、技术使用中遇到的问题和解决过程

Flask-Admin有add_view视图函数,给admin添加视图的时候,不能放在create_app里。虽然运行没有报错,但是在单元测试的时候会出现蓝本重复注册,正确的方法是在create_app外面调用add_view

admin = Admin(name=u‘应用名称‘)

# 正确示例
admin.add_view(ModelView(name=‘板块‘, category=‘标签‘))

def create_app(config_name):
    app = Flask(__name__)
    app.config.from_object(config[config_name])
    config[config_name].init_app(app)

    admin.init_app(app)

# 错误示例
admin.add_view(ModelView(name=‘板块‘, category=‘标签‘))

return app

四、总结

合理应用Flask Admin,可以用极少量的代码,快速构建小型WEB应用。

五、参考文献

相关推荐