【小沐学Python】Python实现Web服务器(Flask框架扩展:Flask-Admin)

在这里插入图片描述

1、简介

1.1 flask

flask作为一个微框架,Flask 允许您以很少的开销构建 Web 服务。 它为您(设计师)提供了自由,以适合您的方式实施您的项目 特定应用。
在这里插入图片描述
一个最小的 Flask 应用如下:

from flask import Flask
app = Flask(__name__)

@app.route('/')
def hello_world():
    return 'Hello, World!'

1.2 flask-admin

Flask-Admin是一个batteries-included,易于使用的Flask扩展,可让您 向 Flask 应用程序添加管理界面。它的灵感来自 django-admin 包,但以这样的方式实现 开发人员可以完全控制生成的应用程序的外观、感觉和功能的一种方式。开箱即用,Flask-Admin可以很好地与各种ORM配合使用,包括:

  • SQLAlchemy,
  • MongoEngine,
  • pymongo and
  • Peewee.

Flask-Admin的最大特点是灵活性。它旨在提供一组可用于 构建任何复杂的管理界面。因此,首先,您可以立即创建一个非常简单的应用程序, 为每个模型自动生成 CRUD 视图。但是,您可以更进一步并自定义这些视图和表单。 根据需要出现。

  • 微服务和API的世界中,Flask-Admin解决了在顶部构建管理界面的现有数据模型。毫不费力,它让您可以通过用户友好的界面管理 Web 服务的数据。

  • Flask-Admin背后的基本概念是,它可以让您 通过对各个视图进行分组来构建复杂的界面 一起在类中:您在前端看到的每个网页都代表一个 已显式添加到接口的类上的方法。

  • 当这些视图类绑定到特定视图类时,它们特别有用 数据库模型, 因为它们允许您将所有常用的创建、读取、更新、删除 (CRUD) 视图逻辑组合到单个自包含中 每个模型的类。

在这里插入图片描述

2、安装

2.1 安装库

通过pip安装如下:

pip install flask-admin

在这里插入图片描述

2.2 打印库版本

打印flask-admin库的版本信息:
方法1:

## 格式:pip show 库名
pip show flask-admin

在这里插入图片描述
方法2:

## 格式:pip list
pip list flask-admin

在这里插入图片描述
方法3:

## 格式:库名.__version__
import flask_admin
print('flask_admin版本:',flask_admin.__version__)

在这里插入图片描述

3、初始化

第一步是为 Flask 应用初始化一个空的管理界面:

from flask import Flask
from flask_admin import Admin

app = Flask(__name__)

# set optional bootswatch theme
app.config['FLASK_ADMIN_SWATCH'] = 'cerulean'

admin = Admin(app, name='爱看书的小沐', template_mode='bootstrap3')
# Add administrative views here

app.run()

运行上面脚本之后,命令行输出如下信息:
在这里插入图片描述
打开浏览器访问:

http://127.0.0.1:5000/

在这里插入图片描述
换一个地址试试:

http://127.0.0.1:5000/admin

在这里插入图片描述

页面终于正常显示了。
上面代码中的这一行定义。

admin = Admin(app, name='爱看书的小沐', template_mode='bootstrap3')

可以分开写成如下多行。

admin = Admin(name='爱看书的小沐')
# Add views here
admin.init_app(app)

4、添加独立视图(BaseView)

4.1 管理接口索引页

  • test.py
from flask import Flask
from flask_admin import Admin, BaseView, AdminIndexView, expose

app = Flask(__name__)
# set optional bootswatch theme
app.config['FLASK_ADMIN_SWATCH'] = 'cerulean'
app.config['DEBUG'] = True
app.config['SECRET_KEY'] = 'super-secret'
app.config['BABEL_DEFAULT_LOCALE'] = 'zh_CN'

# AdminIndexView:当访问/admin/url时,默认的管理接口索引页;它可以通过将你自己的视图类传递给Admin构造函数来重写
## index_view = AdminIndexView(name=u'首页', template='index.html')
## admin = Admin(app, name=u"后台管理系统", template_mode='bootstrap3', index_view=index_view)

class MyAdminIndexView(AdminIndexView):
    @expose("/")
    def homepage(self):
        return self.render("index.html")

admin = Admin(
    app, 
    name=u"后台管理系统",
    index_view=MyAdminIndexView(name="预览页"),
    template_mode='bootstrap3'
)

app.run()
  • index.html
{% extends 'admin/master.html' %}
{% block body %}
    Hello World from 爱看书的小沐!
{% endblock %}

在这里插入图片描述

4.2 自定义视图

① 每一个自定义视图必须提供一个@expose(‘/’)的index方法,否则会报错
② 可以定义多个独立视图类,然后将其定义到同一个类型里面

import os.path as op
from flask import Flask
from flask_admin import Admin, BaseView, AdminIndexView, expose

app = Flask(__name__)
# set optional bootswatch theme
app.config['FLASK_ADMIN_SWATCH'] = 'cerulean'
app.config['DEBUG'] = True
app.config['SECRET_KEY'] = 'super-secret'
app.config['BABEL_DEFAULT_LOCALE'] = 'zh_CN'

# AdminIndexView:当访问/admin/url时,默认的管理接口索引页;它可以通过将你自己的视图类传递给Admin构造函数来重写
class MyAdminIndexView(AdminIndexView):
    @expose("/")
    def homepage(self):
        return self.render("admin/index.html")

admin = Admin(
    app, 
    name=u"后台管理系统",
    index_view=MyAdminIndexView(name="预览页"),
    template_mode='bootstrap3'
)

#admin = Admin(
#    app,
#    index_view=AdminIndexView(
#        name='导航栏',
#        template='welcome.html',
#        url='/admin'
#    )
#)

class MyView1(BaseView):
    @expose('/')
    def main(self):
        return self.render('admin/oneview.html')

class MyView2(BaseView):
    @expose('/')
    def main(self):
        return self.render('admin/twoview.html')

class MyView3(BaseView):
    @expose('/')
    def index(self):
        return self.render('admin/index.html')

    @expose('/test/')
    def test(self):
        return self.render('admin/index.html')

# 增加独立视图
admin.add_view(MyView1(name='页面一', category='测试视图', endpoint="/onepage/"))
admin.add_view(MyView2(name='页面二', category='测试视图', endpoint="/twopage/"))

admin.add_view(MyView3(name='页面三'))

admin.add_view(MyView3(name='Hello 1', category='测试视图2', endpoint='test1'))
admin.add_view(MyView3(name='Hello 2', category='测试视图2', endpoint='test2'))
admin.add_view(MyView3(name='Hello 3', category='测试视图2', endpoint='test3'))

app.run()

在这里插入图片描述

class MyNews(BaseView):
    @expose('/', methods=['GET', 'POST'])
    def index(self):
        form = NameForm()
        return self.render('donews.html', form=form)
        
admin.add_view(MyNews(name=u'发表新闻'))

5、添加模型视图(ModelView)

模型视图允许您添加一组专用的管理页面,用于管理数据库中的任何模型。通过创建 ModelView 类的实例,您可以从 Flask-Admin 的内置 ORM 后端之一导入该类。


import os.path as op
from flask import Flask
from flask_admin import Admin, BaseView, AdminIndexView, expose
from flask_admin.contrib.sqla import ModelView
from flask_sqlalchemy import SQLAlchemy

app = Flask(__name__)
# set optional bootswatch theme
app.config['FLASK_ADMIN_SWATCH'] = 'cerulean'
app.config['DEBUG'] = True
app.config['BABEL_DEFAULT_LOCALE'] = 'zh_CN'
app.config['SQLALCHEMY_ECHO'] = True

# app.config['SECRET_KEY'] = 'super-secret'
# app.config['SECURITY_PASSWORD_HASH'] = 'pbkdf2_sha512'
# app.config['SECURITY_PASSWORD_SALT'] = '16a0af319890f662055ba10aecff37e7e033db3fba737e55'
# app.config['SECURITY_USER_IDENTITY_ATTRIBUTES'] = 'email'
app.config['SQLALCHEMY_DATABASE_URI'] = 'mysql://root:root@localhost:3306/flask_test'

db = SQLAlchemy(app)
admin = Admin(app)

class Users(db.Model):
    __tablename__ = 'users'
    id = db.Column(db.Integer, primary_key=True, autoincrement=True)
    created_at = db.Column(db.TIMESTAMP)
    updated_at = db.Column(db.TIMESTAMP)
    username = db.Column(db.String(128))
    email = db.Column(db.String(128))
    nickname = db.Column(db.String(128))
    avatar = db.Column(db.String(255))
    password_hash = db.Column(db.String(128))
    status = db.Column(db.Integer)

class MyView(ModelView):
    # Disable model creation
    can_create = False

    # Override displayed fields
    column_list = ('username', 'email')

    def __init__(self, session, **kwargs):
        # You can pass name and other parameters if you want to
        super(MyView, self).__init__(Users, session, **kwargs)

admin.add_view(MyView(db.session))
# admin.add_view(ModelView(Users, db.session))

app.run()

在这里插入图片描述

将列名中文化,也就是需要重写column_labels。

class MyView(ModelView):
    # Disable model creation
    can_create = False

    # Override displayed fields
    column_list = ('id', 'username', 'email')

    column_labels = {
    
    
        'id': u'序号',
        'username' : u'用户名',
        'email':u'电子邮箱',
    }
    
    def __init__(self, session, **kwargs):
        # You can pass name and other parameters if you want to
        super(MyView, self).__init__(Users, session, **kwargs)

在这里插入图片描述

6、添加特殊视图

6.1 Managing Files & Folders

from flask import Flask
from flask_admin import Admin
from flask_admin.contrib.fileadmin import FileAdmin
import os.path as op

app = Flask(__name__)
# set optional bootswatch theme
app.config['FLASK_ADMIN_SWATCH'] = 'cerulean'

admin = Admin(app, name='爱看书的小沐', template_mode='bootstrap3')

path = op.join(op.dirname(__file__), 'static')
admin.add_view(FileAdmin(path, '/static/', name='文件管理'))

app.run()

在这里插入图片描述
增加参数控制如下:

import os.path as op
from flask import Flask
from flask_admin import Admin
from flask_admin.contrib.fileadmin import FileAdmin
from flask_babelex import Babel

app = Flask(__name__)
# set optional bootswatch theme
app.config['FLASK_ADMIN_SWATCH'] = 'cerulean'
app.config['DEBUG'] = True
app.config['SECRET_KEY'] = 'super-secret'
app.config['BABEL_DEFAULT_LOCALE'] = 'zh_CN'

babel = Babel(app)
admin = Admin(app, name='爱看书的小沐', template_mode='bootstrap3')

class MyAdmin(FileAdmin):
    can_upload = False
    can_download = False
    can_delete = False
    can_delete_dirs = False
    can_mkdir = False
    can_rename = False
    allowed_extensions = ('swf', 'jpg', 'gif', 'png')

path = op.join(op.dirname(__file__), 'static')
admin.add_view(MyAdmin(path, '/static/', name='文件管理'))

app.run()

在这里插入图片描述

6.2 Adding A Redis Console

另一个可用的插件是 Redis 控制台。如果您有 Redis 实例与您的应用在同一台计算机上运行,您可以:

from flask import Flask
from flask_admin import Admin

from redis import Redis
from flask_admin.contrib import rediscli

app = Flask(__name__)
# set optional bootswatch theme
app.config['FLASK_ADMIN_SWATCH'] = 'cerulean'
app.config['DEBUG'] = True
app.config['SECRET_KEY'] = 'super-secret'

admin = Admin(app, name='爱看书的小沐', template_mode='bootstrap3')

# Flask setup here
admin.add_view(rediscli.RedisCli(Redis()))

app.run()

在这里插入图片描述

7、中文支持

from flask_babelex import Babel
# 使用flask_babelex可以显示中文,该模块用于做国际化
babel = Babel(app)

有两种方式支持显示中文,分别如下:
① app设置增加如下:BABEL_DEFAULT_LOCALE = “zh_CN”

app.config['BABEL_DEFAULT_LOCALE'] = 'zh_CN'

② 增加如下方法

from flask import request, session
# 如下方法也可以定义中文展示,其效果类似于BABEL_DEFAULT_LOCALE = "zh_CN"
@babel.localeselector
def get_locale():
    if request.args.get('lang'):
        session['lang'] = request.args.get('lang')
    return session.get('lang', 'zh_Hans_CN')

在这里插入图片描述

8、身份验证

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

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

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

一般后台并不是对所有用户开放的,所有牵扯到了管理员权限,这一块我是依靠flask-login这个扩展实现的。

class MyView(ModelView):
    def is_accessible(self):
        if current_user.is_authenticated and current_user.username == "admin":
            return True
        return False

    # Disable model creation
    can_create = False

    # Override displayed fields
    column_list = ('id', 'username', 'email')

    column_labels = {
    
    
        'id': u'序号',
        'username' : u'用户名',
        'email':u'电子邮箱',
    }
    
    def __init__(self, session, **kwargs):
        # You can pass name and other parameters if you want to
        super(MyView, self).__init__(Users, session, **kwargs)

在这里插入图片描述
此刻用户管理分页被隐藏了。

结语

如果您觉得该方法或代码有一点点用处,可以给作者点个赞,或打赏杯咖啡;╮( ̄▽ ̄)╭
如果您感觉方法或代码不咋地//(ㄒoㄒ)//,就在评论处留言,作者继续改进;o_O???
如果您需要相关功能的代码定制化开发,可以留言私信作者;(✿◡‿◡)
感谢各位大佬童鞋们的支持!( ´ ▽´ )ノ ( ´ ▽´)っ!!!

在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/hhy321/article/details/130461069