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???如果您需要相关功能的代码定制化开发,可以留言私信作者;
(✿◡‿◡)感谢各位大佬童鞋们的支持!
( ´ ▽´ )ノ ( ´ ▽´)っ!!!文章来源:https://www.toymoban.com/news/detail-431695.html
文章来源地址https://www.toymoban.com/news/detail-431695.html
到了这里,关于【小沐学Python】Python实现Web服务器(Flask框架扩展:Flask-Admin)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!