flask-admin 快速打造博客 系列二 (整合flask-admin)

整合flask-admin


前言

Flask-admin 至关django的xadmin吧!但是xadmin虽然样式很漂亮,功能也很强大,但是灵活性不够,官方文档缺失,这两个缘由就足以让我选择不用了。
Flask-admin也是有使用局限性的,他只适合开发小型快速的应用,不适合那种大型并发性高,逻辑复杂的应用。首先,对于大型应用都是先后端分离的,加快访问速度,并且后端装配,尤为是这种动态生成页面的速度更慢。
对于通常的博客,小型的论坛或者官网之类的网站,其实页面真多不到那里去,用flask开发仍是绰绰有余的。python

1)基础整理flask-admin

from flask_admin import Admin
admin = Admin(app, name='cleanblog', template_mode='bootstrap3')
#template_mode 若是没有指定就默认bootstrap2的样式了

而后打开浏览器http://127.0.0.1:5005/admin/ 看到:git

clipboard.png

2) 整合model到flask-admin

2.1咱们先增长两个modelgithub

class Article(db.Model):
    id = db.Column(db.Integer, primary_key=True)
    title=db.Column(db.String(32))
    content=db.Column(db.Text,nullable=False)
    tag=db.Column(db.String(64),nullable=True)
    create_time = db.Column(db.DateTime, nullable=True, default=datetime.now)

    def __repr__(self):
        return '<User %r>' % self.title

数据模型sql

class Tag(db.Model):
    id = db.Column(db.Integer, primary_key=True)
    name = db.Column(db.String(32), nullable=False)
    desc = db.Column(db.String(64), nullable=True)
    create_time = db.Column(db.DateTime, nullable=True, default=datetime.now)

    def __repr__(self):
        return '<User %r>' % self.name

而后注册model到flask-admin中:django

from .models import User,Tag,Article
from .modelview import BaseModelview
admin = Admin(app, name='cleanblog', template_mode='bootstrap3')

admin.add_view(BaseModelview(User, db.session,name=u'用户管理'))
admin.add_view(BaseModelview(Tag, db.session, name=u'标签管理'))
admin.add_view(BaseModelview(Article, db.session, name=u'文章管理'))

这里有一个定义的BaseModelview是做为一个全局的Modelview来用的,是为了自定义一些model的view界面上的显示的。flask

class BaseModelview(ModelView):
    def getinfo(self):
        return "this is another model"

里面什么都没有,若是后期扩展权限限制了,能够在这里加代码限制。
而后,重启服务:http://127.0.0.1:5005/admin/bootstrap

在这里咱们,咱们就能够看到一些效果显示出来了,挺好看的。后端

clipboard.png

而后看一下新增文章的视图:api

clipboard.png

不是富文本的,使人恨不能满意,那么就改成ckEditor的吧!官方有相应的支持,咱们就直接看官网。浏览器

3)自定义调整样式

3.1 调整area区为富文本:使用ckEditor编辑器,官方提供的文档有说明在:
http://flask-admin.readthedoc... WYSIWIG Text Field 里面有
(1)直接拷贝相应的代码到 modelview.py

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(BaseModelview):
    extra_js = ['//cdn.ckeditor.com/4.6.0/standard/ckeditor.js']

    form_overrides = {
        'content': CKTextAreaField
    }

前面两个类是直接官方拷贝过来的,后面一个继承咱们的BaseModelview,而后再在
Form_overrides里写明content字段是使用CKTextAreaField的扩展就能够了。
(2)修改注册的article类:
admin.add_view(MessageAdmin(Article, db.session, name=u'文章管理'))

重启后,打开连接: http://127.0.0.1:5005/admin/article/new/?url=%2Fadmin%2Farticle%2F

4) 上传图片

官网有一个demo 就是讲怎么上传图片的https://github.com/flask-admi... 能够做为参考的
User里有一个头像img_head 字段,以此为例进行讲解:
(1) 自定义user的modelview

from sqlalchemy.event import listens_for
import os.path as op
import  os
from jinja2 import Markup

file_path = op.join(op.dirname(__file__), 'static') # 文件上传路径

class UserAdmin(BaseModelview):
    #设置缩略图的
    def _list_thumbnail(view, context, model, name):
        if not model.head_img:
            return ''

        return Markup('<img src="%s">' % url_for('static',
                                               filename=form.thumbgen_filename(model.head_img)))
    # 格式化列表的图像显示
    column_formatters = {
        'head_img': _list_thumbnail
    }
    #扩展列表显示的头像为60*60像素
    form_extra_fields = {
        'head_img': form.ImageUploadField('Image',
                                     base_path=file_path,
                                     relative_path='uploadFile/',
                                     thumbnail_size=(60, 60, True))
    }

其实还须要增长另外一个类,用于sql的监听,但该用户被删除的时候,同时也在磁盘上把图片删除:

##监听删除图片的
@listens_for(User, 'after_delete')
def del_image(mapper, connection, target):
    if target.head_img:
        # Delete image
        try:
            os.remove(op.join(file_path, target.head_img))
        except OSError:
            pass

        # Delete thumbnail
        try:
            os.remove(op.join(file_path,
                              form.thumbgen_filename(target.head_img)))
        except OSError:
            pass

注意:head_img 字段名不能写错,写错就展现不了

(2)注册modelview 并重启服务
admin.add_view(UserAdmin(User, db.session,name=u'用户管理'))
重启后的结果:

clipboard.png

clipboard.png

(3) 修改表格头显示
表格头默认是显示是表的字段名,咱们能够自定义为本身的中文显示,这一块还跟国际化无关,因此稍感郁闷啊。
在modelview.py 对应的自定义UserAdmin中加入

column_labels = {
    'id': u'序号',
    'email': u'邮件',
    'username': u'用户名',
    'role': u'角色',
    'password_hash': u'密码',
    'head_img': u'头像',
    'create_time':u'建立时间'
}

显示的结果:

clipboard.png

(4)隐藏显示字段
在用户显示的列表中,加密后的密码,经过咱们是不但愿显示出来的,那就把他隐藏掉:
column_exclude_list = [' password_hash', ]
modeview加入该字段后重启就有效果了:

clipboard.png

(5)其余自定义化功能:
其余自定义化功能不少,能够参考:http://flask-admin.readthedoc...
想增长过滤的字段:column_filters = ['country']
想设置可查询的字段:column_searchable_list = ['name', 'email']
想指定可编辑的字段:column_editable_list = ['name', 'last_name']
即不建立也不编辑的字段:form_excluded_columns = ['last_name', 'email']
增长可选择下拉框的:
form_extra_fields = {
'tag':form.Select2Field('请选择',choices=[('xiaoming','xiaoming'),('xiao2','xodk2')])
}

关于这些方法怎么查的到呢?首先,你要想获得,有这方面的需求,而后再去base,baseview,ModelView等类中看源码,也能够去对应的官网查看api就能查到对应的解决方法。

相关文章
相关标签/搜索