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