Python的Flask框架中Flask-Admin庫(kù)的簡(jiǎn)單入門指引
Flask-Admin是一個(gè)功能齊全、簡(jiǎn)單易用的Flask擴(kuò)展,讓你可以為Flask應(yīng)用程序增加管理界面。它受django-admin包的影響,但用這樣一種方式實(shí)現(xiàn),開(kāi)發(fā)者擁有最終應(yīng)用程序的外觀、感覺(jué)和功能的全部控制權(quán)。
本文是關(guān)于Flask-Admin庫(kù)的快速入門。本文假設(shè)讀者預(yù)先具有一些Flask框架的知識(shí)。
- 介紹
- 初始化
- 增加視圖
- 身份驗(yàn)證
- 生成URL
- 模型視圖
- 文件管理
介紹
這個(gè)庫(kù)打算做到盡可能的靈活。并且開(kāi)發(fā)者不需要任何猴子補(bǔ)丁就可以獲得期望的功能。
這個(gè)庫(kù)使用一個(gè)簡(jiǎn)單而強(qiáng)大的概念——管理部件(administrative pieces,不太好翻譯),是用視圖方法構(gòu)建的類。
例如,這是一個(gè)絕對(duì)有效的管理部件:
class MyView(BaseView):
@expose('/')
def index(self):
return self.render('admin/myindex.html')
@expose('/test/')
def test(self):
return self.render('admin/test.html')
如果用戶訪問(wèn)index視圖,模板文件admin/myindex.html會(huì)被渲染。同樣的,訪問(wèn)test視圖的結(jié)果是admin/test.html被渲染。
那么,這個(gè)方法怎樣幫助管理界面的結(jié)構(gòu)化?使用這些已建立的部件,你可以實(shí)施高度定制化的可重復(fù)使用的功能。
例如,F(xiàn)lask-Admin提供一個(gè)現(xiàn)成的SQLAlchemy模型接口。它以類執(zhí)行并接受2個(gè)參數(shù):模型類和數(shù)據(jù)庫(kù)會(huì)話。當(dāng)它顯示一些改變接口的行為的類級(jí)變量(有點(diǎn)像django.contrib.admin),沒(méi)有任何東西阻止你繼承它并覆蓋表單創(chuàng)建邏輯、數(shù)據(jù)庫(kù)存儲(chǔ)方法或者通過(guò)增加更多的視圖擴(kuò)展現(xiàn)有的功能。
初始化
要開(kāi)始使用Flask-Admin,你需要?jiǎng)?chuàng)建一個(gè)Admin類實(shí)例并和Flask應(yīng)用程序?qū)嵗P(guān)聯(lián)。
from flask import Flask from flask.ext.admin import Admin app = Flask(__name__) admin = Admin(app) # Add administrative views here app.run()
如果你運(yùn)行這個(gè)程序并訪問(wèn)http://localhost:5000/admin/,你會(huì)看到一個(gè)頂部有導(dǎo)航欄的空的“Home”頁(yè)面:

你可以更換應(yīng)用程序名稱通過(guò)傳值給Admin類構(gòu)造函數(shù)的name參數(shù):
admin = Admin(app, name='My App')
作為一個(gè)選擇方案,在Admin實(shí)例初始化之后,你可以調(diào)用init_app()函數(shù)把Flask應(yīng)用程序?qū)ο髠鹘oAdmin構(gòu)造函數(shù):
admin = Admin(name='My App') # Add views here admin.init_app(app)
增加視圖
現(xiàn)在,讓我們?cè)黾右粋€(gè)管理視圖。下面的例子會(huì)致使兩個(gè)項(xiàng)目出現(xiàn)在導(dǎo)航菜單:Home和Hello。為此,你需要衍生于BaseView類:
from flask import Flask
from flask.ext.admin import Admin, BaseView, expose
class MyView(BaseView):
@expose('/')
def index(self):
return self.render('index.html')
app = Flask(__name__)
admin = Admin(app)
admin.add_view(MyView(name='Hello'))
app.run()
一個(gè)關(guān)于管理視圖的重要約束是每個(gè)視圖類應(yīng)該擁有一個(gè)默認(rèn)的以根URL/開(kāi)頭的頁(yè)面視圖方法。下面的例子是正確的:
class MyView(BaseView):
@expose('/')
def index(self):
return self.render('index.html')
可是,這個(gè)不工作:
class MyView(BaseView):
@expose('/index/')
def index(self):
return self.render('index.html')
現(xiàn)在,創(chuàng)建一個(gè)新的index.html文件并寫入如下內(nèi)容:
{% extends 'admin/master.html' %}
{% block body %}
Hello World from MyView!
{% endblock %}
然后把它放到templates目錄。為維持一致的外觀和感覺(jué),所有管理頁(yè)面應(yīng)該延伸于admin/master.html模板。
你現(xiàn)在應(yīng)該看到Hello頁(yè)面的新的管理頁(yè)面起作用了。
要增加另一個(gè)級(jí)別的菜單項(xiàng)目,你可以指定category參數(shù)的值當(dāng)傳送管理視圖給Admin實(shí)例時(shí)。category指定頂級(jí)菜單項(xiàng)目的名字,并且所有與之關(guān)聯(lián)的視圖,都會(huì)通過(guò)下拉菜單進(jìn)入。例如:
from flask import Flask
from flask.ext.admin import Admin, BaseView, expose
class MyView(BaseView):
@expose('/')
def index(self):
return self.render('index.html')
app = Flask(__name__)
admin = Admin(app)
admin.add_view(MyView(name='Hello 1', endpoint='test1', category='Test'))
admin.add_view(MyView(name='Hello 2', endpoint='test2', category='Test'))
admin.add_view(MyView(name='Hello 3', endpoint='test3', category='Test'))
app.run()
看起來(lái)是這樣的:

要增加另一個(gè)級(jí)別的菜單項(xiàng)目,你可以指定category參數(shù)的值當(dāng)傳送管理視圖給Admin實(shí)例時(shí)。category指定頂級(jí)菜單項(xiàng)目的名字,并且所有與之關(guān)聯(lián)的視圖,都會(huì)通過(guò)下拉菜單進(jìn)入。例如:
from flask import Flask
from flask.ext.admin import Admin, BaseView, expose
class MyView(BaseView):
@expose('/')
def index(self):
return self.render('index.html')
app = Flask(__name__)
admin = Admin(app)
admin.add_view(MyView(name='Hello 1', endpoint='test1', category='Test'))
admin.add_view(MyView(name='Hello 2', endpoint='test2', category='Test'))
admin.add_view(MyView(name='Hello 3', endpoint='test3', category='Test'))
app.run()
看起來(lái)是這樣的:

身份驗(yàn)證
Flask-Admin沒(méi)有設(shè)想任何你可以使用的身份驗(yàn)證系統(tǒng)。因此,默認(rèn)的,管理界面是完全開(kāi)放的。
要控制使用管理界面,你可以指定is_accessible方法當(dāng)擴(kuò)展BaseView類時(shí)。那么,舉例,如果你使用Flask-Login做身份驗(yàn)證,下面的代碼確保只有已登入的用戶能訪問(wèn)視圖:
class MyView(BaseView):
def is_accessible(self):
return login.current_user.is_authenticated()
你也可以實(shí)施基于策略的保密,有條件的允許或不允許使用管理界面的某些部分。如果一個(gè)用戶無(wú)權(quán)使用某個(gè)特定視圖,則菜單項(xiàng)目不可見(jiàn)。
生成URL
在內(nèi)部,視圖類工作于Flask藍(lán)圖的頂部,因此你可以使用url_for附帶一個(gè).前綴來(lái)獲得局部視圖的URL:
from flask import url_for
class MyView(BaseView):
@expose('/')
def index(self)
# Get URL for the test view method
url = url_for('.test')
return self.render('index.html', url=url)
@expose('/test/')
def test(self):
return self.render('test.html')
如果你要在外部生成一個(gè)特定視圖的URL,應(yīng)用下面的規(guī)則:
你可以覆蓋endpoint名稱通過(guò)傳送endpoint參數(shù)給視圖類構(gòu)造函數(shù):
admin = Admin(app)
admin.add_view(MyView(endpoint='testadmin'))
# In this case, you can generate links by concatenating the view method name with an endpoint:
url_for('testadmin.index')
如果你不覆蓋endpoint名稱,類名的小寫形式會(huì)用于生成URL,像這樣:
url_for('myview.index')
對(duì)基于模型的視圖規(guī)則不一樣——模型類名稱會(huì)被使用如果沒(méi)有提供endpoint名稱?;谀P偷囊晥D下一節(jié)解釋。
模型視圖
模型視圖允許你為數(shù)據(jù)庫(kù)中的每個(gè)模型增加專用的管理頁(yè)面。通過(guò)創(chuàng)建ModelView類實(shí)例做這個(gè),ModelView類可從Flask-Admin內(nèi)置的ORM后端引入。一個(gè)SQLAlchemy后端的例子,你可以這樣使用:
from flask.ext.admin.contrib.sqla import ModelView # Flask and Flask-SQLAlchemy initialization here admin = Admin(app) admin.add_view(ModelView(User, db.session))
這創(chuàng)建一個(gè)User模型的管理界面。默認(rèn)的,列表視圖看起來(lái)是這樣的:

要定制這些模型視圖,你有兩個(gè)選擇:一是覆蓋ModelView類的公有屬性,二是覆蓋它的方法。
例如,假如你要禁用模型創(chuàng)建功能并且只在列表視力顯示某些列,你可以這樣做:
from flask.ext.admin.contrib.sqla import ModelView
# Flask and Flask-SQLAlchemy initialization here
class MyView(ModelView):
# Disable model creation
can_create = False
# Override displayed fields
column_list = ('login', 'email')
def __init__(self, session, **kwargs):
# You can pass name and other parameters if you want to
super(MyView, self).__init__(User, session, **kwargs)
admin = Admin(app)
admin.add_view(MyView(db.session))
覆蓋表單元素有些棘手,但還是可能的。這個(gè)例子是關(guān)于如何建立一個(gè)包含有只允許使用預(yù)定義值的名為status的列的表單,并使用SelectField:
from wtforms.fields import SelectField
class MyView(ModelView):
form_overrides = dict(status=SelectField)
form_args = dict(
# Pass the choices to the `SelectField`
status=dict(
choices=[(0, 'waiting'), (1, 'in_progress'), (2, 'finished')]
))
通過(guò)繼承BaseModelView類和實(shí)現(xiàn)數(shù)據(jù)庫(kù)相關(guān)的方法為不同的數(shù)據(jù)庫(kù)后端(比如Mongo等)增加支持是相對(duì)容易的。
關(guān)于如何定制基于模型的管理視圖的行為請(qǐng)參考flask.ext.admin.contrib.sqla文檔。
文件管理
Flask-Admin擁有另一個(gè)便利的特性——文件管理。它給予你管理服務(wù)器文件的能力(上傳、刪除、重命名等)。
這是一個(gè)簡(jiǎn)單的例子:
from flask.ext.admin.contrib.fileadmin import FileAdmin import os.path as op # Flask setup here admin = Admin(app) path = op.join(op.dirname(__file__), 'static') admin.add_view(FileAdmin(path, '/static/', name='Static Files'))
例子截圖:

你可以禁用上傳、禁用文件或目錄刪除、限制文件上傳類型等等。關(guān)于怎么做這些請(qǐng)查看flask.ext.admin.contrib.fileadmin文檔。
相關(guān)文章
Python+Turtle實(shí)現(xiàn)繪制可愛(ài)的小倉(cāng)鼠
肉嘟嘟的小動(dòng)物很是可愛(ài),這篇文章主要為大家介紹一下如何運(yùn)用Python中的turtle庫(kù)控制函數(shù)繪制小倉(cāng)鼠,文中的實(shí)現(xiàn)方法講解詳細(xì),感興趣的可以嘗試一下2022-10-10
用Python讀取幾十萬(wàn)行文本數(shù)據(jù)
今天小編就為大家分享一篇關(guān)于用Python讀取幾十萬(wàn)行文本數(shù)據(jù),小編覺(jué)得內(nèi)容挺不錯(cuò)的,現(xiàn)在分享給大家,具有很好的參考價(jià)值,需要的朋友一起跟隨小編來(lái)看看吧2018-12-12
一文帶你安裝opencv與常用庫(kù)(保姆級(jí)教程)
Python OpenCV是一種流行的計(jì)算機(jī)視覺(jué)庫(kù),使用它可以進(jìn)行圖像處理、視頻處理等操作,下面這篇文章主要給大家介紹了關(guān)于安裝opencv與常用庫(kù)的相關(guān)資料,需要的朋友可以參考下2023-05-05
python實(shí)現(xiàn)Adapter模式實(shí)例代碼
這篇文章主要介紹了python實(shí)現(xiàn)Adapter模式實(shí)例代碼,分享了相關(guān)代碼示例,小編覺(jué)得還是挺不錯(cuò)的,具有一定借鑒價(jià)值,需要的朋友可以參考下2018-02-02
python如何實(shí)現(xiàn)質(zhì)數(shù)求和
這篇文章主要介紹了python如何實(shí)現(xiàn)質(zhì)數(shù)求和,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-05-05
Django獲取model中的字段名和字段的verbose_name方式
這篇文章主要介紹了Django獲取model中的字段名和字段的verbose_name方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2020-05-05
教你pycharm運(yùn)行Django第一個(gè)項(xiàng)目
本文主要介紹了教你pycharm運(yùn)行Django第一個(gè)項(xiàng)目的實(shí)現(xiàn),文中通過(guò)圖文示例介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2021-08-08

