Flask-Admin 后臺(tái)管理
Flask-Admin是一個(gè)簡單易用的Flask擴(kuò)展,讓你可以很方便并快速地為Flask應(yīng)用程序增加管理界面硅堆。
上手
先用pip 安裝flask-admin擴(kuò)展
pip install flask-admin
初始化
from flask import Flask
from flask_admin import Admin, BaseView, expose
app = Flask(__name__)
admin = Admin(app[,name=u'后臺(tái)管理系統(tǒng)'])
app.run()
訪問http://localhost:5000/admin/就可以看到一個(gè)簡單的Home頁面,其中name為自定義系統(tǒng)名记某,會(huì)顯示在導(dǎo)航欄上
增加視圖
在之前代碼上增加
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 %}
歡迎來到后臺(tái)管理系統(tǒng)耘子!
{% endblock %}
這里采用的模板語言為Jinjia2果漾,查看Jinjia2文檔
增加數(shù)據(jù)庫模型視圖
這是Flask-Admin很方便的一個(gè)部分,只需要很少的代碼谷誓,就可以為某個(gè)數(shù)據(jù)庫模型實(shí)現(xiàn)管理視圖绒障,這里采用Flask-SQLAlchemy作為ORM后端
from flask_admin.contrib.sqla import ModelView
# 在這里初始化Flask Flask-SQLAlchemy Flask-Admin
admin.add_view(ModelView(User, db.session))
注:右上角加了管理員登錄
不過網(wǎng)頁默認(rèn)顯示全是英文,需要漢化處理捍歪,F(xiàn)lask-Admin自帶國際化户辱,所以中文顯示也很方便
用Flask-BabelEx做國際化
from flask_babelex import Babel
app = Flask(__name__)
babel = Babel(app)
app.config['BABEL_DEFAULT_LOCALE'] = 'zh_CN'
然后運(yùn)行,很方便就可以以中文顯示糙臼,如果改成其他語言也非常方便
定制數(shù)據(jù)庫模型視圖
class UserView(ModelView):
#這三個(gè)變量定義管理員是否可以增刪改庐镐,默認(rèn)為True
can_delete = False
can_edit = False
can_create = False
#這里是為了自定義顯示的column名字
column_labels = dict(
username=u'用戶名',
)
#如果不想顯示某些字段,可以重載這個(gè)變量
column_exclude_list = (
'password_hash',
)
# 只需把自己寫的處理模型的視圖加進(jìn)去就行了弓摘,category是可選的目錄
admin.add_view(UserView(User, db.session, name=u'信息', category=u'用戶'))
更多可定制選項(xiàng)見flask_admin.model文檔
用Flask-Login做身份驗(yàn)證
管理員系統(tǒng)不能是開放的焚鹊,應(yīng)該做一下身份驗(yàn)證,我這里用Flask-Login做身份驗(yàn)證
這里比較復(fù)雜一點(diǎn)韧献,首先要定制templates下的模板文件index.html
實(shí)現(xiàn)管理員登錄帶有CSRF 令牌的安全表單
{% extends 'admin/master.html' %}
{% block body %}
{{ super() }}
{% if current_user.is_authenticated %}
歡迎來到后臺(tái)管理系統(tǒng)末患!
{% 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'賬號不存在')
#這里密碼不能明文存儲(chǔ),我用sha256_crypt加密
if not sha256_crypt.verify(self.password.data, user.password):
raise validators.ValidationError(u'密碼錯(cuò)誤')
def get_user(self):
#AdminUser是存儲(chǔ)管理員用戶密碼的表
return db.session.query(AdminUser).filter_by(login=self.login.data).first()
安裝flask-login
pip install flask-login
初始化锤窑,調(diào)用init_login()函數(shù)即可
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)
然后在需要管理員權(quán)限的才能看到的視圖中添加代碼
#決定身份驗(yàn)證可見
def is_accessible(self):
return current_user.is_authenticated
管理上傳文件和圖片
文件上傳璧针,很簡單的調(diào)用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='文件'))
圖片上傳
#假設(shè)pics為需要上傳圖片的字段
form_extra_fields = {
'pics': upload.ImageUploadField(label=u圖片',
base_path=file_path),
}