1、簡介
1.1 flask
flask作為一個微框架,F(xiàn)lask 允許您以很少的開銷構(gòu)建 Web 服務(wù)。 它為您(設(shè)計師)提供了自由,以適合您的方式實施您的項目 特定應(yīng)用。
一個最小的 Flask 應(yīng)用如下:
from flask import Flask
app = Flask(__name__)
@app.route('/')
def hello_world():
return 'Hello, World!'
1.2 flask-admin
Flask-Admin是一個batteries-included,易于使用的Flask擴(kuò)展,可讓您 向 Flask 應(yīng)用程序添加管理界面。它的靈感來自 django-admin 包,但以這樣的方式實現(xiàn) 開發(fā)人員可以完全控制生成的應(yīng)用程序的外觀、感覺和功能的一種方式。開箱即用,F(xiàn)lask-Admin可以很好地與各種ORM配合使用,包括:
- SQLAlchemy,
- MongoEngine,
- pymongo and
- Peewee.
Flask-Admin的最大特點(diǎn)是靈活性。它旨在提供一組可用于 構(gòu)建任何復(fù)雜的管理界面。因此,首先,您可以立即創(chuàng)建一個非常簡單的應(yīng)用程序, 為每個模型自動生成 CRUD 視圖。但是,您可以更進(jìn)一步并自定義這些視圖和表單。 根據(jù)需要出現(xiàn)。
-
微服務(wù)和API的世界中,F(xiàn)lask-Admin解決了在頂部構(gòu)建管理界面的現(xiàn)有數(shù)據(jù)模型。毫不費(fèi)力,它讓您可以通過用戶友好的界面管理 Web 服務(wù)的數(shù)據(jù)。
-
Flask-Admin背后的基本概念是,它可以讓您 通過對各個視圖進(jìn)行分組來構(gòu)建復(fù)雜的界面 一起在類中:您在前端看到的每個網(wǎng)頁都代表一個 已顯式添加到接口的類上的方法。
-
當(dāng)這些視圖類綁定到特定視圖類時,它們特別有用 數(shù)據(jù)庫模型, 因為它們允許您將所有常用的創(chuàng)建、讀取、更新、刪除 (CRUD) 視圖邏輯組合到單個自包含中 每個模型的類。
2、安裝
2.1 安裝庫
通過pip安裝如下:
pip install flask-admin
2.2 打印庫版本
打印flask-admin庫的版本信息:
方法1:
## 格式:pip show 庫名
pip show flask-admin
方法2:
## 格式:pip list
pip list flask-admin
方法3:
## 格式:庫名.__version__
import flask_admin
print('flask_admin版本:',flask_admin.__version__)
3、初始化
第一步是為 Flask 應(yīng)用初始化一個空的管理界面:
from flask import Flask
from flask_admin import Admin
app = Flask(__name__)
# set optional bootswatch theme
app.config['FLASK_ADMIN_SWATCH'] = 'cerulean'
admin = Admin(app, name='愛看書的小沐', template_mode='bootstrap3')
# Add administrative views here
app.run()
運(yùn)行上面腳本之后,命令行輸出如下信息:
打開瀏覽器訪問:
http://127.0.0.1:5000/
換一個地址試試:
http://127.0.0.1:5000/admin
頁面終于正常顯示了。
上面代碼中的這一行定義。
admin = Admin(app, name='愛看書的小沐', template_mode='bootstrap3')
可以分開寫成如下多行。
admin = Admin(name='愛看書的小沐')
# Add views here
admin.init_app(app)
4、添加獨(dú)立視圖(BaseView)
4.1 管理接口索引頁
- test.py
from flask import Flask
from flask_admin import Admin, BaseView, AdminIndexView, expose
app = Flask(__name__)
# set optional bootswatch theme
app.config['FLASK_ADMIN_SWATCH'] = 'cerulean'
app.config['DEBUG'] = True
app.config['SECRET_KEY'] = 'super-secret'
app.config['BABEL_DEFAULT_LOCALE'] = 'zh_CN'
# AdminIndexView:當(dāng)訪問/admin/url時,默認(rèn)的管理接口索引頁;它可以通過將你自己的視圖類傳遞給Admin構(gòu)造函數(shù)來重寫
## index_view = AdminIndexView(name=u'首頁', template='index.html')
## admin = Admin(app, name=u"后臺管理系統(tǒng)", template_mode='bootstrap3', index_view=index_view)
class MyAdminIndexView(AdminIndexView):
@expose("/")
def homepage(self):
return self.render("index.html")
admin = Admin(
app,
name=u"后臺管理系統(tǒng)",
index_view=MyAdminIndexView(name="預(yù)覽頁"),
template_mode='bootstrap3'
)
app.run()
- index.html
{% extends 'admin/master.html' %}
{% block body %}
Hello World from 愛看書的小沐!
{% endblock %}
4.2 自定義視圖
① 每一個自定義視圖必須提供一個@expose(‘/’)的index方法,否則會報錯
② 可以定義多個獨(dú)立視圖類,然后將其定義到同一個類型里面
import os.path as op
from flask import Flask
from flask_admin import Admin, BaseView, AdminIndexView, expose
app = Flask(__name__)
# set optional bootswatch theme
app.config['FLASK_ADMIN_SWATCH'] = 'cerulean'
app.config['DEBUG'] = True
app.config['SECRET_KEY'] = 'super-secret'
app.config['BABEL_DEFAULT_LOCALE'] = 'zh_CN'
# AdminIndexView:當(dāng)訪問/admin/url時,默認(rèn)的管理接口索引頁;它可以通過將你自己的視圖類傳遞給Admin構(gòu)造函數(shù)來重寫
class MyAdminIndexView(AdminIndexView):
@expose("/")
def homepage(self):
return self.render("admin/index.html")
admin = Admin(
app,
name=u"后臺管理系統(tǒng)",
index_view=MyAdminIndexView(name="預(yù)覽頁"),
template_mode='bootstrap3'
)
#admin = Admin(
# app,
# index_view=AdminIndexView(
# name='導(dǎo)航欄',
# template='welcome.html',
# url='/admin'
# )
#)
class MyView1(BaseView):
@expose('/')
def main(self):
return self.render('admin/oneview.html')
class MyView2(BaseView):
@expose('/')
def main(self):
return self.render('admin/twoview.html')
class MyView3(BaseView):
@expose('/')
def index(self):
return self.render('admin/index.html')
@expose('/test/')
def test(self):
return self.render('admin/index.html')
# 增加獨(dú)立視圖
admin.add_view(MyView1(name='頁面一', category='測試視圖', endpoint="/onepage/"))
admin.add_view(MyView2(name='頁面二', category='測試視圖', endpoint="/twopage/"))
admin.add_view(MyView3(name='頁面三'))
admin.add_view(MyView3(name='Hello 1', category='測試視圖2', endpoint='test1'))
admin.add_view(MyView3(name='Hello 2', category='測試視圖2', endpoint='test2'))
admin.add_view(MyView3(name='Hello 3', category='測試視圖2', endpoint='test3'))
app.run()
class MyNews(BaseView):
@expose('/', methods=['GET', 'POST'])
def index(self):
form = NameForm()
return self.render('donews.html', form=form)
admin.add_view(MyNews(name=u'發(fā)表新聞'))
5、添加模型視圖(ModelView)
模型視圖允許您添加一組專用的管理頁面,用于管理數(shù)據(jù)庫中的任何模型。通過創(chuàng)建 ModelView 類的實例,您可以從 Flask-Admin 的內(nèi)置 ORM 后端之一導(dǎo)入該類。
import os.path as op
from flask import Flask
from flask_admin import Admin, BaseView, AdminIndexView, expose
from flask_admin.contrib.sqla import ModelView
from flask_sqlalchemy import SQLAlchemy
app = Flask(__name__)
# set optional bootswatch theme
app.config['FLASK_ADMIN_SWATCH'] = 'cerulean'
app.config['DEBUG'] = True
app.config['BABEL_DEFAULT_LOCALE'] = 'zh_CN'
app.config['SQLALCHEMY_ECHO'] = True
# app.config['SECRET_KEY'] = 'super-secret'
# app.config['SECURITY_PASSWORD_HASH'] = 'pbkdf2_sha512'
# app.config['SECURITY_PASSWORD_SALT'] = '16a0af319890f662055ba10aecff37e7e033db3fba737e55'
# app.config['SECURITY_USER_IDENTITY_ATTRIBUTES'] = 'email'
app.config['SQLALCHEMY_DATABASE_URI'] = 'mysql://root:root@localhost:3306/flask_test'
db = SQLAlchemy(app)
admin = Admin(app)
class Users(db.Model):
__tablename__ = 'users'
id = db.Column(db.Integer, primary_key=True, autoincrement=True)
created_at = db.Column(db.TIMESTAMP)
updated_at = db.Column(db.TIMESTAMP)
username = db.Column(db.String(128))
email = db.Column(db.String(128))
nickname = db.Column(db.String(128))
avatar = db.Column(db.String(255))
password_hash = db.Column(db.String(128))
status = db.Column(db.Integer)
class MyView(ModelView):
# Disable model creation
can_create = False
# Override displayed fields
column_list = ('username', 'email')
def __init__(self, session, **kwargs):
# You can pass name and other parameters if you want to
super(MyView, self).__init__(Users, session, **kwargs)
admin.add_view(MyView(db.session))
# admin.add_view(ModelView(Users, db.session))
app.run()
將列名中文化,也就是需要重寫column_labels。
class MyView(ModelView):
# Disable model creation
can_create = False
# Override displayed fields
column_list = ('id', 'username', 'email')
column_labels = {
'id': u'序號',
'username' : u'用戶名',
'email':u'電子郵箱',
}
def __init__(self, session, **kwargs):
# You can pass name and other parameters if you want to
super(MyView, self).__init__(Users, session, **kwargs)
6、添加特殊視圖
6.1 Managing Files & Folders
from flask import Flask
from flask_admin import Admin
from flask_admin.contrib.fileadmin import FileAdmin
import os.path as op
app = Flask(__name__)
# set optional bootswatch theme
app.config['FLASK_ADMIN_SWATCH'] = 'cerulean'
admin = Admin(app, name='愛看書的小沐', template_mode='bootstrap3')
path = op.join(op.dirname(__file__), 'static')
admin.add_view(FileAdmin(path, '/static/', name='文件管理'))
app.run()
增加參數(shù)控制如下:
import os.path as op
from flask import Flask
from flask_admin import Admin
from flask_admin.contrib.fileadmin import FileAdmin
from flask_babelex import Babel
app = Flask(__name__)
# set optional bootswatch theme
app.config['FLASK_ADMIN_SWATCH'] = 'cerulean'
app.config['DEBUG'] = True
app.config['SECRET_KEY'] = 'super-secret'
app.config['BABEL_DEFAULT_LOCALE'] = 'zh_CN'
babel = Babel(app)
admin = Admin(app, name='愛看書的小沐', template_mode='bootstrap3')
class MyAdmin(FileAdmin):
can_upload = False
can_download = False
can_delete = False
can_delete_dirs = False
can_mkdir = False
can_rename = False
allowed_extensions = ('swf', 'jpg', 'gif', 'png')
path = op.join(op.dirname(__file__), 'static')
admin.add_view(MyAdmin(path, '/static/', name='文件管理'))
app.run()
6.2 Adding A Redis Console
另一個可用的插件是 Redis 控制臺。如果您有 Redis 實例與您的應(yīng)用在同一臺計算機(jī)上運(yùn)行,您可以:
from flask import Flask
from flask_admin import Admin
from redis import Redis
from flask_admin.contrib import rediscli
app = Flask(__name__)
# set optional bootswatch theme
app.config['FLASK_ADMIN_SWATCH'] = 'cerulean'
app.config['DEBUG'] = True
app.config['SECRET_KEY'] = 'super-secret'
admin = Admin(app, name='愛看書的小沐', template_mode='bootstrap3')
# Flask setup here
admin.add_view(rediscli.RedisCli(Redis()))
app.run()
7、中文支持
from flask_babelex import Babel
# 使用flask_babelex可以顯示中文,該模塊用于做國際化
babel = Babel(app)
有兩種方式支持顯示中文,分別如下:
① app設(shè)置增加如下:BABEL_DEFAULT_LOCALE = “zh_CN”
app.config['BABEL_DEFAULT_LOCALE'] = 'zh_CN'
② 增加如下方法
from flask import request, session
# 如下方法也可以定義中文展示,其效果類似于BABEL_DEFAULT_LOCALE = "zh_CN"
@babel.localeselector
def get_locale():
if request.args.get('lang'):
session['lang'] = request.args.get('lang')
return session.get('lang', 'zh_Hans_CN')
8、身份驗證
Flask-Admin沒有設(shè)想任何你可以使用的身份驗證系統(tǒng)。因此,默認(rèn)的管理界面是完全開放的。
要控制使用管理界面,你可以指定is_accessible方法當(dāng)擴(kuò)展BaseView類時。那么,舉例,如果你使用Flask-Login做身份驗證,下面的代碼確保只有已登入的用戶能訪問視圖:
class MyView(BaseView):
def is_accessible(self):
return login.current_user.is_authenticated()
一般后臺并不是對所有用戶開放的,所有牽扯到了管理員權(quán)限,這一塊我是依靠flask-login這個擴(kuò)展實現(xiàn)的。
class MyView(ModelView):
def is_accessible(self):
if current_user.is_authenticated and current_user.username == "admin":
return True
return False
# Disable model creation
can_create = False
# Override displayed fields
column_list = ('id', 'username', 'email')
column_labels = {
'id': u'序號',
'username' : u'用戶名',
'email':u'電子郵箱',
}
def __init__(self, session, **kwargs):
# You can pass name and other parameters if you want to
super(MyView, self).__init__(Users, session, **kwargs)
此刻用戶管理分頁被隱藏了。
結(jié)語
如果您覺得該方法或代碼有一點(diǎn)點(diǎn)用處,可以給作者點(diǎn)個贊,或打賞杯咖啡;
╮( ̄▽ ̄)╭如果您感覺方法或代碼不咋地
//(ㄒoㄒ)//,就在評論處留言,作者繼續(xù)改進(jìn);
o_O???如果您需要相關(guān)功能的代碼定制化開發(fā),可以留言私信作者;
(????)感謝各位大佬童鞋們的支持!
( ′ ▽′ )? ( ′ ▽′)っ!??!文章來源:http://www.zghlxwxcb.cn/news/detail-431695.html
文章來源地址http://www.zghlxwxcb.cn/news/detail-431695.html
到了這里,關(guān)于【小沐學(xué)Python】Python實現(xiàn)Web服務(wù)器(Flask框架擴(kuò)展:Flask-Admin)的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!