【译】Flask-Admin中文入门教程

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

quickstart_1.png

你能够更换应用程序名称经过传值给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页面的新的管理页面起做用了。

quickstart_2.png

要增长另外一个级别的菜单项目,你能够指定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()

看起来是这样的:

quickstart_3.png

身份验证

Flask-Admin没有设想任何你可使用的身份验证系统。所以,默认的,管理界面是彻底开放的。

要控制使用管理界面,你能够指定is_accessible方法当扩展BaseView类时。那么,举例,若是你使用Flask-Login作身份验证,下面的代码确保只有已登入的用户能访问视图:

pythonclass MyView(BaseView):
    def is_accessible(self):
        return login.current_user.is_authenticated()

你也能够实施基于策略的保密,有条件的容许或不容许使用管理界面的某些部分。若是一个用户无权使用某个特定视图,则菜单项目不可见。

生成URL

在内部,视图类工做于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,应用下面的规则:

  1. 你能够覆盖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')
  2. 若是你不覆盖endpoint名称,类名的小写形式会用于生成URL,像这样:

    pythonurl_for('myview.index')
  3. 对基于模型的视图规则不同——模型类名称会被使用若是没有提供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模型的管理界面。默认的,列表视图看起来是这样的:

quickstart_4.png

要定制这些模型视图,你有两个选择:一是覆盖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'))

例子截图:

quickstart_5.png

你能够禁用上传、禁用文件或目录删除、限制文件上传类型等等。关于怎么作这些请查看flask.ext.admin.contrib.fileadmin文档。


本文译自Flask-Admin文档Quick Start部分。水平有限,欢迎指正。


原文:http://flask123.sinaapp.com/article/57/

相关文章
相关标签/搜索