Flask的图形化管理界面搭建框架Flask-Admin的使用教程
|
Flask-Admin是Flask框架的一个扩展,用它能够快速创建Web管理界面,它实现了比如用户、文件的增删改查等常用的管理功能;如果对它的默认界面不喜欢,可以通过修改模板文件来定制; 项目地址:https://flask-admin.readthedocs.io/en/latest/ example/simple
from flask import Flask
from flask.ext import admin
# Create custom admin view
class MyAdminView(admin.BaseView):
@admin.expose('/')
def index(self):
return self.render('myadmin.html')
class AnotherAdminView(admin.BaseView):
@admin.expose('/')
def index(self):
return self.render('anotheradmin.html')
@admin.expose('/test/')
def test(self):
return self.render('test.html')
# Create flask app
app = Flask(__name__,template_folder='templates')
app.debug = True
# Flask views
@app.route('/')
def index():
return '<a href="/admin/">Click me to get to Admin!</a>'
# Create admin interface
admin = admin.Admin()
admin.add_view(MyAdminView(category='Test'))
admin.add_view(AnotherAdminView(category='Test'))
admin.init_app(app)
if __name__ == '__main__':
# Start app
app.run()
在这里可以看到运行效果 BaseView 所有的view都必须继承自BaseView:复制代码 代码如下:
{% extends 'admin/master.html' %}
{% block body %}
Hello World from AnotherMyAdmin!<br/>
<a href="{{ url_for('.test') }}">Click me to go to test view</a>
{% endblock %}
如果AnotherAdminView增加参数endpoint='xxx',那这里就可以写成url_for('xxx.text'),然后页面URL会由/admin/anotheradminview/变成/admin/xxx 复制代码 代码如下: name: Application name,缺省'Admin';会显示为main menu name('Home'左边的'Admin')和page title subdomain: ??? index_view: 'Home'那个menu对应的就叫index view,缺省AdminIndexView base_template: 基础模板,缺省admin/base.html,该模板在Flask-Admin的源码目录里面 部分Admin代码如下:
class MenuItem(object):
"""
Simple menu tree hierarchy.
"""
def __init__(self,name,view=None):
self.name = name
self._view = view
self._children = []
self._children_urls = set()
self._cached_url = None
self.url = None
if view is not None:
self.url = view.url
def add_child(self,view):
self._children.append(view)
self._children_urls.add(view.url)
class Admin(object):
def __init__(self,app=None,base_template=None):
self.app = app
self.translations_path = translations_path
self._views = []
self._menu = []
self._menu_categories = dict()
self._menu_links = []
if name is None:
name = 'Admin'
self.name = name
self.index_view = index_view or AdminIndexView(endpoint=endpoint,url=url)
self.endpoint = endpoint or self.index_view.endpoint
self.url = url or self.index_view.url
self.static_url_path = static_url_path
self.subdomain = subdomain
self.base_template = base_template or 'admin/base.html'
# Add predefined index view
self.add_view(self.index_view)
# Register with application
if app is not None:
self._init_extension()
def add_view(self,view):
# Add to views
self._views.append(view)
# If app was provided in constructor,register view with Flask app
if self.app is not None:
self.app.register_blueprint(view.create_blueprint(self))
self._add_view_to_menu(view)
def _add_view_to_menu(self,view):
if view.category:
category = self._menu_categories.get(view.category)
if category is None:
category = MenuItem(view.category)
self._menu_categories[view.category] = category
self._menu.append(category)
category.add_child(MenuItem(view.name,view))
else:
self._menu.append(MenuItem(view.name,view))
def init_app(self,app):
self.app = app
self._init_extension()
# Register views
for view in self._views:
app.register_blueprint(view.create_blueprint(self))
self._add_view_to_menu(view)
从上面的代码可以看出init_app(app)和Admin(app=app)是一样的: 复制代码 代码如下:
class AdminIndexView(BaseView):
def __init__(self,template='admin/index.html'):
super(AdminIndexView,self).__init__(name or babel.lazy_gettext('Home'),category,endpoint or 'admin',url or '/admin','static')
self._template = template
@expose()
def index(self):
return self.render(self._template)
base_template
base_template缺省是/admin/base.html,是页面的主要代码(基于bootstrap),它里面又import admin/layout.html;
{% macro menu() %}
{% for item in admin_view.admin.menu() %}
{% if item.is_category() %}
{% set children = item.get_children() %}
{% if children %}
{% if item.is_active(admin_view) %}<li class="active dropdown">{% else %}<li class="dropdown">{% endif %}
<a class="dropdown-toggle" data-toggle="dropdown" href="javascript:void(0)">{{ item.name }}<b class="caret"></b></a>
<ul class="dropdown-menu">
{% for child in children %}
{% if child.is_active(admin_view) %}<li class="active">{% else %}<li>{% endif %}
<a href="{{ child.get_url() }}">{{ child.name }}</a>
</li>
{% endfor %}
</ul>
</li>
{% endif %}
{% else %}
{% if item.is_accessible() and item.is_visible() %}
{% if item.is_active(admin_view) %}<li class="active">{% else %}<li>{% endif %}
<a href="{{ item.get_url() }}">{{ item.name }}</a>
</li>
{% endif %}
{% endif %}
{% endfor %}
{% endmacro %}
example/file
import os
import os.path as op
from flask import Flask
from flask.ext import admin
from flask.ext.admin.contrib import fileadmin
# Create flask app
app = Flask(__name__,template_folder='templates',static_folder='files')
# Create dummy secrey key so we can use flash
app.config['SECRET_KEY'] = '123456790'
# Flask views
@app.route('/')
def index():
return '<a href="/admin/">Click me to get to Admin!</a>'
if __name__ == '__main__':
# Create directory
path = op.join(op.dirname(__file__),'files')
try:
os.mkdir(path)
except OSError:
pass
# Create admin interface
admin = admin.Admin(app)
admin.add_view(fileadmin.FileAdmin(path,'/files/',name='Files'))
# Start app
app.run(debug=True)
FileAdmin是已经写好的的一个view,直接用即可: 复制代码 代码如下: (编辑:安卓应用网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
