Flask-Admin使用教程

5,765 阅读2分钟
原文链接: blog.labradors.work
September 12, 2018 · 技术

Flask-Admin使用教程

准备写一个区块链资讯APP,但后台管理需要不错的前端技能,因为前端技术实在不敢恭维。所以找了flask-admin框架,搭建起来后看起来还不错。接入方便快捷,基本不需要前端技术。先来看图。

看起来还不错吧。一点链后台管理系统暂时只实现了用户管理,资讯管理。对于Flask-Admin也只是简单的使用,比如自定义字段,字段命名,权限认证等等。

安装

pip install flask-admin
pip install Flask-BabelEx
pip install Flask-Login
  • flask-admin: 后台管理框架。
  • Flask-BabelEx: 国际化支持
  • Flask-Login:flask-admin权限管理。

配置

def reg_babel(app):
    BABEL_DEFAULT_LOCALE = 'zh_CN'
    babel = Babel(app)


def reg_admin(app):
    """
    注册后台管理
    :param app:
    :return:
    """
    admin = Admin(app=app, name='一点链后台管理系统', index_view=OBCAdminIndexView(), base_template='my_master.html')
    admin.add_view(UserView(User, db.session, name='用户'))
    admin.add_view(AnnouncementView(Announcement, db.session, name='资讯'))


def reg_login_manager(app):
    login_manager = LoginManager()
    login_manager.init_app(app)

    @login_manager.user_loader
    def load_user(user_id):
        return db.session.query(User).get(user_id)

上面三个函数包含了三个框架的注册以及配置。reg_babel配置支持国际化。reg_login_manager配置登陆管理器。reg_admin配置支持flask后台管理系统。其中admin注册需要指定admin view以及html。并且需要将需要管理的数据库进行配置导入。

Flask-Admin主页

添加flask-admin主要步骤如下:

  • 配置用户数据库模型。
  • 添加AdminIndexView视图处理
  • 添加页面
  • 添加其余模型视图处理。

配置用户数据库模型

@property
    def is_authenticated(self):
        return True

    @property
    def is_active(self):
        return True

    @property
    def is_anonymous(self):
        return False

    def get_id(self):
        return self.id

    # Required for administrative interface
    def __unicode__(self):
        return self.username

在用户模型下加入如上。

添加AdminIndexView视图处理

class OBCAdminIndexView(AdminIndexView):
    @expose('/')
    def index(self):
        if not current_user.is_authenticated:
            return redirect(url_for('.login_view'))
        return super(OBCAdminIndexView, self).index()

    @expose('/login/', methods=('GET', 'POST'))
    def login_view(self):
        # handle user login
        form = AdminLoginForm(request.form)
        if helpers.validate_form_on_submit(form):
            user = form.get_user()
            login_user(user)

        if current_user.is_authenticated:
            return redirect(url_for('.index'))
        link = '<p>Don\'t have an account? <a href="' + url_for('.login_view') + '">Click here to register.</a></p>'
        self._template_args['form'] = form
        self._template_args['link'] = link
        return super(OBCAdminIndexView, self).index()

    @expose('/logout/')
    def logout_view(self):
        logout_user()
        return redirect(url_for('.index'))

处理流程如下:

  • 判断是否认证。
  • 没有认证跳转到登陆,如果已经认证,直接进入系统。

添加其余模型视图处理

html页面就不展示了。一点链后台添加了用户,资讯管理模型,代码如下:

class UserView(ModelView):
    # 这里是为了自定义显示的column名字

    def is_accessible(self):
        return current_user.is_authenticated

    column_labels = dict(
        id=u'用户ID',
        email=u'邮箱',
        nickname=u'用户名',
        create_time=u'创建时间',
        status=u'状态'

    )

    # 如果不想显示某些字段,可以重载这个变量

    column_exclude_list = (

        '_password',

    )


class AnnouncementView(ModelView):
    def is_accessible(self):
        return current_user.is_authenticated

    column_labels = dict(
        id=u'资讯ID',
        title=u'标题',
        content=u'内容',
        type=u'子类型',
        url=u'资讯地址',
        datetime=u'时间',
        news_type=u'类型',
        create_time=u'创建时间',
        status=u'状态'

    )

已在代码中作出注释。

总结

本文因为开发进度,暂时只使用Flask-Admin这些功能。后续将介绍更多功能的使用。