Flask-Admin 后台管理介绍

Flask-Admin 后台管理

Flask-Admin是一个简单易用的Flask扩展,让你可以很方便并快速地为Flask应用程序增加管理界面。

上手

先用pip 安装flask-admin扩展


pip install flask-admin

初始化


from flask import Flask

from flask_admin import Admin, BaseView, expose

app = Flask(__name__)

admin = Admin(app[,name=u'后台管理系统'])

app.run()

访问http://localhost:5000/admin/就可以看到一个简单的Home页面,其中name为自定义系统名,会显示在导航栏上

后台

增加视图

在之前代码上增加


class MyView(BaseView):

#这里类似于app.route(),处理url请求

@expose('/')

def index(self):

return self.render('index.html')

admin.add_view(MyView(name=u'Hello'))

在templates下写模板文件index.html


{% extends 'admin/master.html' %}   #为了保持一致,继承admin/master.html模板

{% block body %}

欢迎来到后台管理系统!

{% endblock %}

这里采用的模板语言为Jinjia2,查看Jinjia2文档

增加数据库模型视图

这是Flask-Admin很方便的一个部分,只需要很少的代码,就可以为某个数据库模型实现管理视图,这里采用Flask-SQLAlchemy作为ORM后端


from flask_admin.contrib.sqla import ModelView

# 在这里初始化Flask Flask-SQLAlchemy Flask-Admin

admin.add_view(ModelView(User, db.session))

模型视图例子

注:右上角加了管理员登录

不过网页默认显示全是英文,需要汉化处理,Flask-Admin自带国际化,所以中文显示也很方便

用Flask-BabelEx做国际化


from flask_babelex import Babel

app = Flask(__name__)

babel = Babel(app)

app.config['BABEL_DEFAULT_LOCALE'] = 'zh_CN'

然后运行,很方便就可以以中文显示,如果改成其他语言也非常方便

中文显示

定制数据库模型视图


class UserView(ModelView):

#这三个变量定义管理员是否可以增删改,默认为True

can_delete = False

can_edit = False

can_create = False

#这里是为了自定义显示的column名字

column_labels = dict(

username=u'用户名',

)

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

column_exclude_list = (

'password_hash',

)

# 只需把自己写的处理模型的视图加进去就行了,category是可选的目录

admin.add_view(UserView(User, db.session, name=u'信息', category=u'用户'))

更多可定制选项见flask_admin.model文档

用Flask-Login做身份验证

管理员系统不能是开放的,应该做一下身份验证,我这里用Flask-Login做身份验证

这里比较复杂一点,首先要定制templates下的模板文件index.html

实现管理员登录带有CSRF 令牌的安全表单


{% extends 'admin/master.html' %}

{% block body %}

{{ super() }}

{% if current_user.is_authenticated %}







欢迎来到后台管理系统!

{% else %}

{{ form.hidden_tag() if form.hidden_tag }}

{% for f in form if f.type != 'CSRFTokenField' %}

{{ f.label }}

{{ f }}

{% if f.errors %}

{% for e in f.errors %}

{{ e }}

{% endfor %}

{% endif %}

{% endfor %}

登陆

{{ link | safe }}

{% endif %}

{% endblock body %}

处理管理员登录


#这里的fields和validators是用的Flask-WTForm

from wtforms import fields, validators

class LoginForm(FlaskForm):

login = fields.StringField(label=u'管理员账号', validators=[validators.required()])

password = fields.PasswordField(label=u'密码', validators=[validators.required()])

def validate_login(self, field):

user = self.get_user()

if user is None:

raise validators.ValidationError(u'账号不存在')

#这里密码不能明文存储,我用sha256_crypt加密

if not sha256_crypt.verify(self.password.data, user.password):

raise validators.ValidationError(u'密码错误')

def get_user(self):

#AdminUser是存储管理员用户密码的表

return db.session.query(AdminUser).filter_by(login=self.login.data).first()

安装flask-login


pip install flask-login

初始化,调用init_login()函数即可


from flask_login import current_user, login_user, logout_user, LoginManager

def init_login():

login_manager = LoginManager()

login_manager.init_app(app)

@login_manager.user_loader

def load_user(user_id):

return db.session.query(AdminUser).get(user_id)

然后在需要管理员权限的才能看到的视图中添加代码


#决定身份验证可见

def is_accessible(self):

return current_user.is_authenticated

管理上传文件和图片

文件上传,很简单的调用FileAdmin即可


from flask_admin.contrib.fileadmin import FileAdmin

import os.path as op

file_path = op.join(op.dirname(__file__), 'static')

admin.add_view(FileAdmin(file_path, '/static/', name='文件'))

图片上传


#假设pics为需要上传图片的字段

form_extra_fields = {

'pics': upload.ImageUploadField(label=u图片',

base_path=file_path),

}

上传图片

参考

Flask-Admin文档Quick Start

Flask-Admin中文入门教程

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 199,064评论 5 466
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 83,606评论 2 376
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 146,011评论 0 328
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 53,550评论 1 269
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 62,465评论 5 359
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 47,919评论 1 275
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,428评论 3 390
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,075评论 0 254
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,208评论 1 294
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,185评论 2 317
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,191评论 1 328
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,914评论 3 316
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,482评论 3 302
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,585评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,825评论 1 255
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,194评论 2 344
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 41,703评论 2 339

推荐阅读更多精彩内容