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')
如果用户访问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()
如果你运行这个程序并访问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)
增加视图
现在,让我们增加一个管理视图。下面的例子会致使两个项目出现在导航菜单: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()
一个关于管理视图的重要约束是每个视图类应该拥有一个默认的以根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()
看起来是这样的:
要增加另一个级别的菜单项目,你可以指定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()
看起来是这样的:
身份验证
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')
如果你要在外部生成一个特定视图的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')
如果你不覆盖endpoint名称,类名的小写形式会用于生成URL,像这样:
url_for('myview.index')
对基于模型的视图规则不一样——模型类名称会被使用如果没有提供endpoint名称。基于模型的视图下一节解释。
模型视图
模型视图允许你为数据库中的每个模型增加专用的管理页面。通过创建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))
这创建一个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))
覆盖表单元素有些棘手,但还是可能的。这个例子是关于如何建立一个包含有只允许使用预定义值的名为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')] ))
通过继承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文档。

Python和C 各有优势,选择应基于项目需求。1)Python适合快速开发和数据处理,因其简洁语法和动态类型。2)C 适用于高性能和系统编程,因其静态类型和手动内存管理。

选择Python还是C 取决于项目需求:1)如果需要快速开发、数据处理和原型设计,选择Python;2)如果需要高性能、低延迟和接近硬件的控制,选择C 。

通过每天投入2小时的Python学习,可以有效提升编程技能。1.学习新知识:阅读文档或观看教程。2.实践:编写代码和完成练习。3.复习:巩固所学内容。4.项目实践:应用所学于实际项目中。这样的结构化学习计划能帮助你系统掌握Python并实现职业目标。

在两小时内高效学习Python的方法包括:1.回顾基础知识,确保熟悉Python的安装和基本语法;2.理解Python的核心概念,如变量、列表、函数等;3.通过使用示例掌握基本和高级用法;4.学习常见错误与调试技巧;5.应用性能优化与最佳实践,如使用列表推导式和遵循PEP8风格指南。

Python适合初学者和数据科学,C 适用于系统编程和游戏开发。1.Python简洁易用,适用于数据科学和Web开发。2.C 提供高性能和控制力,适用于游戏开发和系统编程。选择应基于项目需求和个人兴趣。

Python更适合数据科学和快速开发,C 更适合高性能和系统编程。1.Python语法简洁,易于学习,适用于数据处理和科学计算。2.C 语法复杂,但性能优越,常用于游戏开发和系统编程。

每天投入两小时学习Python是可行的。1.学习新知识:用一小时学习新概念,如列表和字典。2.实践和练习:用一小时进行编程练习,如编写小程序。通过合理规划和坚持不懈,你可以在短时间内掌握Python的核心概念。

Python更易学且易用,C 则更强大但复杂。1.Python语法简洁,适合初学者,动态类型和自动内存管理使其易用,但可能导致运行时错误。2.C 提供低级控制和高级特性,适合高性能应用,但学习门槛高,需手动管理内存和类型安全。


热AI工具

Undresser.AI Undress
人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover
用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool
免费脱衣服图片

Clothoff.io
AI脱衣机

Video Face Swap
使用我们完全免费的人工智能换脸工具轻松在任何视频中换脸!

热门文章

热工具

SublimeText3 Mac版
神级代码编辑软件(SublimeText3)

安全考试浏览器
Safe Exam Browser是一个安全的浏览器环境,用于安全地进行在线考试。该软件将任何计算机变成一个安全的工作站。它控制对任何实用工具的访问,并防止学生使用未经授权的资源。

Atom编辑器mac版下载
最流行的的开源编辑器

EditPlus 中文破解版
体积小,语法高亮,不支持代码提示功能

SecLists
SecLists是最终安全测试人员的伙伴。它是一个包含各种类型列表的集合,这些列表在安全评估过程中经常使用,都在一个地方。SecLists通过方便地提供安全测试人员可能需要的所有列表,帮助提高安全测试的效率和生产力。列表类型包括用户名、密码、URL、模糊测试有效载荷、敏感数据模式、Web shell等等。测试人员只需将此存储库拉到新的测试机上,他就可以访问到所需的每种类型的列表。