Flask-Admin是一個功能齊全、簡單易用的Flask擴展,讓你能夠爲Flask應用程序增長管理界面。它受django-admin包的影響,但用這樣一種方式實現,開發者擁有最終應用程序的外觀、感受和功能的所有控制權。html
本文是關於Flask-Admin庫的快速入門。本文假設讀者預先具備一些Flask框架的知識。python
這個庫打算作到儘量的靈活。而且開發者不須要任何猴子補丁就能夠得到指望的功能。sql
這個庫使用一個簡單而強大的概念——管理部件(administrative pieces,不太好翻譯),是用視圖方法構建的類。數據庫
例如,這是一個絕對有效的管理部件:django
pythonclass MyView(BaseView): @expose('/') def index(self): return self.render('admin/myindex.html') @expose('/test/') def test(self): return self.render('admin/test.html')
若是用戶訪問index
視圖,模板文件admin/myindex.html
會被渲染。一樣的,訪問test
視圖的結果是admin/test.html
被渲染。flask
那麼,這個方法怎樣幫助管理界面的結構化?使用這些已創建的部件,你能夠實施高度定製化的可重複使用的功能。後端
例如,Flask-Admin提供一個現成的SQLAlchemy模型接口。它以類執行並接受2個參數:模型類和數據庫會話。當它顯示一些改變接口的行爲的類級變量(有點像django.contrib.admin
),沒有任何東西阻止你繼承它並覆蓋表單建立邏輯、數據庫存儲方法或者經過增長更多的視圖擴展示有的功能。服務器
要開始使用Flask-Admin,你須要建立一個Admin
類實例並和Flask應用程序實例關聯。session
pythonfrom flask import Flask from flask.ext.admin import Admin app = Flask(__name__) admin = Admin(app) # Add administrative views here app.run()
若是你運行這個程序並訪問http://localhost:5000/admin/,你會看到一個頂部有導航欄的空的「Home」頁面:app
你能夠更換應用程序名稱經過傳值給Admin
類構造函數的name
參數:
pythonadmin = Admin(app, name='My App')
做爲一個選擇方案,在Admin
實例初始化以後,你能夠調用init_app()
函數把Flask應用程序對象傳給Admin
構造函數:
pythonadmin = Admin(name='My App') # Add views here admin.init_app(app)
如今,讓咱們增長一個管理視圖。下面的例子會導致兩個項目出如今導航菜單:Home和Hello。爲此,你須要衍生於BaseView
類:
pythonfrom 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()
一個關於管理視圖的重要約束是每一個視圖類應該擁有一個默認的以根URL /
開頭的頁面視圖方法。下面的例子是正確的:
pythonclass MyView(BaseView): @expose('/') def index(self): return self.render('index.html')
但是,這個不工做:
pythonclass MyView(BaseView): @expose('/index/') def index(self): return self.render('index.html')
如今,建立一個新的index.html
文件並寫入以下內容:
html{% extends 'admin/master.html' %} {% block body %} Hello World from MyView! {% endblock %}
而後把它放到templates
目錄。爲維持一致的外觀和感受,全部管理頁面應該延伸於admin/master.html
模板。
你如今應該看到Hello頁面的新的管理頁面起做用了。
要增長另外一個級別的菜單項目,你能夠指定category
參數的值當傳送管理視圖給Admin
實例時。category
指定頂級菜單項目的名字,而且全部與之關聯的視圖,都會經過下拉菜單進入。例如:
pythonfrom 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()
看起來是這樣的:
Flask-Admin沒有設想任何你可使用的身份驗證系統。所以,默認的,管理界面是徹底開放的。
要控制使用管理界面,你能夠指定is_accessible
方法當擴展BaseView
類時。那麼,舉例,若是你使用Flask-Login作身份驗證,下面的代碼確保只有已登入的用戶能訪問視圖:
pythonclass MyView(BaseView): def is_accessible(self): return login.current_user.is_authenticated()
你也能夠實施基於策略的保密,有條件的容許或不容許使用管理界面的某些部分。若是一個用戶無權使用某個特定視圖,則菜單項目不可見。
在內部,視圖類工做於Flask藍圖的頂部,所以你可使用url_for
附帶一個.
前綴來得到局部視圖的URL:
pythonfrom 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')
若是你要在外部生成一個特定視圖的URL,應用下面的規則:
你能夠覆蓋endpoint
名稱經過傳送endpoint
參數給視圖類構造函數:
pythonadmin = 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
名稱,類名的小寫形式會用於生成URL,像這樣:
pythonurl_for('myview.index')
對基於模型的視圖規則不同——模型類名稱會被使用若是沒有提供endpoint
名稱。基於模型的視圖下一節解釋。
模型視圖容許你爲數據庫中的每一個模型增長專用的管理頁面。經過建立ModelView
類實例作這個,ModelView
類可從Flask-Admin內置的ORM後端引入。一個SQLAlchemy後端的例子,你能夠這樣使用:
pythonfrom flask.ext.admin.contrib.sqla import ModelView # Flask and Flask-SQLAlchemy initialization here admin = Admin(app) admin.add_view(ModelView(User, db.session))
這建立一個User
模型的管理界面。默認的,列表視圖看起來是這樣的:
要定製這些模型視圖,你有兩個選擇:一是覆蓋ModelView
類的公有屬性,二是覆蓋它的方法。
例如,假如你要禁用模型建立功能而且只在列表視力顯示某些列,你能夠這樣作:
pythonfrom 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))
覆蓋表單元素有些棘手,但仍是可能的。這個例子是關於如何創建一個包含有隻容許使用預約義值的名爲status
的列的表單,並使用SelectField:
pythonfrom 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')] ))
經過繼承BaseModelView
類和實現數據庫相關的方法爲不一樣的數據庫後端(好比Mongo等)增長支持是相對容易的。
關於如何定製基於模型的管理視圖的行爲請參考flask.ext.admin.contrib.sqla
文檔。
Flask-Admin擁有另外一個便利的特性——文件管理。它給予你管理服務器文件的能力(上傳、刪除、重命名等)。
這是一個簡單的例子:
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'))
例子截圖:
你能夠禁用上傳、禁用文件或目錄刪除、限制文件上傳類型等等。關於怎麼作這些請查看flask.ext.admin.contrib.fileadmin
文檔。
本文譯自Flask-Admin文檔Quick Start部分。水平有限,歡迎指正。