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

news2025/1/10 16:40:56

在这里插入图片描述

文章目录

  • 1、简介
    • 1.1 flask
    • 1.2 flask-admin
  • 2、安装
    • 2.1 安装库
    • 2.2 打印库版本
  • 3、初始化
  • 4、添加独立视图(BaseView)
    • 4.1 管理接口索引页
    • 4.2 自定义视图
  • 5、添加模型视图(ModelView)
  • 6、添加特殊视图
    • 6.1 Managing Files & Folders
    • 6.2 Adding A Redis Console
  • 7、中文支持
  • 8、身份验证
  • 结语

1、简介

1.1 flask

flask作为一个微框架,Flask 允许您以很少的开销构建 Web 服务。 它为您(设计师)提供了自由,以适合您的方式实施您的项目 特定应用。

1.2 flask-admin

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

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

  • (3)当这些视图类绑定到特定视图类时,它们特别有用 数据库模型, 因为它们允许您将所有常用的创建、读取、更新、删除 (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???
如果您需要相关功能的代码定制化开发,可以留言私信作者;(✿◡‿◡)
感谢各位大佬童鞋们的支持!( ´ ▽´ )ノ ( ´ ▽´)っ!!!

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/482766.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

VS2019配置redis客户端的c++开发环境

目录 需要的开源库: 具体步骤: 遇到的问题: 1. 确保每个项目使用的配置解决方案管理器一样 2.CMAKE 的安装 3. 使用 CMAKE 的路径配置 4. redis 编译报错:jemalloc/jemalloc.h没有这个文件,或者找不到.dll 5. linux …

【Linux】初识Linux --指令Ⅰ

Halo,这里是Ppeua。平时主要更新C语言,C,数据结构算法,Linux…感兴趣就关注我吧!你定不会失望。 目录 1.ls 显示当前目录下的文件内内容2.pwd-显示用户当前所在的目录3.cd-改变工作目录。将当前工作目录改变到指定的目…

C++ STL-deque

deque:双端队列 目录 deque:双端队列 1、 基本介绍 2、使用方法 2.1、 头文件 2.2、 定义 2.3、 方法函数 3、排序 1、 基本介绍 首尾都可插入和删除的队列为双端队列。 deque容器是连续的空间,其他连续的行空间还有 array 和 vect…

E. Multihedgehog(多叉树找root节点)

Problem - E - Codeforces 有人给Ivan一个奇怪的生日礼物,这是一只刺猬 - 一个连通的无向图,其中一个顶点的度至少为3(我们称其为中心),而所有其他顶点的度数均为1。Ivan认为刺猬太无聊了,决定自己制造k-多…

总结838

四月结束,五月来临。又到了月度总结与规划的时候了。 四月总结:高等数学原计划复习完18讲内容,刷完对应的习题。如今还剩三讲,本可以看完,但因为后面分专题了,还没确定是数1还是数2.所以耽搁了一下。英语原…

SG函数(博弈论)

一,定义 对于满足以下条件的公平二人游戏,均可以用sg函数(暴搜)获得答案 人数2人 两人交替进行合法操作,无法进行者LOSE对 于游戏的任意一种可能的局面,合法的操作集合只取决于这个局面的本身,…

掌握 Python 接口自动化测试理论,深度解读测试框架源码

目录:导读 引言 一、什么是接口测试、为什么要做接口测试 1、什么是接口测试 2、为什么要做接口测试 二、接口测试的流程 1、接口测试的流程 2、为什么要写测试用例 3、接口测试设计要点 三、python接口自动化-requests的应用 1、requests简介 2、reques…

Winform从入门到精通(37)——FolderBrowserDialog(史上最全)

文章目录 前言1、Name2、Description3、RootFolder4、SelectedPath5、ShowNewFolderButton前言 当需要获取一个可以通过用户自由选择路径的时候,这时候就需要FolderBrowserDialog控件 1、Name 获取FolderBrowserDialog对象 2、Description 用于指示对话框的描述,如下: …

Doris(22):Doris的函数—地理位置函数

1 ST_AsText(GEOMETRY geo) 将一个几何图形转化为WKT(Well Known Text)的表示形式 SELECT ST_AsText(ST_Point(24.7, 56.7)); 2 ST_Circle(DOUBLE center_lng, DOUBLE center_lat, DOUBLE radius) 将一个WKT(Well Known Text)转化为地球球面上的一个圆。其中center_lng表…

20230502 强化学习与反馈控制_利用自然决策方法设计最优自适应控制器

目录:强化学习与反馈控制_利用自然决策方法设计最优自适应控制器 总体介绍强化学习二级目录三级目录 总体介绍 本文描述了利用强化学习原理为离散和连续系统设计反馈控制器,该控制器结合了自适应控制和最优控制的特点。自适应控制和最优控制代表了设计反…

【ElasticSearch】EQL操作相关

文章目录 EQL操作基础语法数据准备数据窗口搜索统计符合条件的事件事件序列 安全检测数据准备查看数据导入情况获取 regsvr32 事件的计数检查命令行参数检查恶意脚本加载检查攻击成功可能性 EQL操作 EQL 的全名是 Event Query Language (EQL)。事件查询语言(EQL&…

Meta财报预测:市场悲观情绪被过度放大,Meta股价未来将强势反弹

来源:猛兽财经 作者:猛兽财经 4月26日收盘后,Meta(META)将发布2023年第一季度财报。由于全球在线广告支出的减少给Meta这样的广告平台带来了很大的压力,市场对Meta的投资情绪非常悲观,华尔街分析师也预测,…

chatGPT免登录的版本哪里有啊

ChatGPT免费次数 Chat GPT 模型通常通过 API 或 SDK 的方式进行使用,并且有一定的免费使用次数或免费试用期,以便用户可以在部分场景下了解模型的性能和效果。但是,每个机器学习平台或服务商的免费使用次数和试用期都可能不同,您…

ChatGPT回复中断的原因-chatGPT国内中文版免费

ChatGPT回复中断怎么办啊 如果您使用ChatGPT时遇到了中断或错误,以下是一些可能有用的解决方案: 检查输入是否正常:输入文本是否符合语法规范和限制条件,例如输入文本长度是否超过了模型限制等等。如果输入不符合要求&#xff0c…

pikachu靶场-Unsafe Filedownload

不安全的文件下载 文件下载功能在很多web系统上都会出现,一般我们当点击下载链接,便会向后台发送一个下载请求,一般这个请求会包含一个需要下载的文件名称,后台在收到请求后 会开始执行下载代码,将该文件名对应的文件…

Mysql数据库基础知识总复习

前言 小亭子正在努力的学习编程,接下来将开启javaEE的学习~~ 分享的文章都是学习的笔记和感悟,如有不妥之处希望大佬们批评指正~~ 同时如果本文对你有帮助的话,烦请点赞关注支持一波, 感激不尽~~ 目录 数据库基础知识 数据,数据…

GPT是什么,GPT-4是什么

GPT是Generative Pre-trained Transformer的缩写,是一种人工智能语言模型。为了实现自然语言生成和文本补全等功能,通过训练大规模数据集,GPT模型可以预测某个词或文本的下一个可能的词或文本。GPT是由OpenAI团队推出的,目前已经推…

如何用 GPT-4 帮你写游戏?

你知道的,GPT-4 发布了。 目前你想要用上 GPT-4,主要的渠道是 ChatGPT Plus 。作为交了订阅费的用户,你可以在对话的时候选择模型来使用。 另一种渠道,就是申请官方 API 的排队。我在申请 New Bing Chat 的时候,耐心被…

完成A轮融资,倍思如何发力场景化为品牌创造广阔未来?

凛冬过后的消费电子正在重新凝聚资本的目光。 近日,深圳市倍思科技有限公司宣布完成由深创投、中金资本联合领投,越秀产业基金、高榕资本跟投,金额数亿元人民币的A轮融资。 分析人士指出,消费电子的行业景气度在逐渐恢复&#x…

LeetCode 1376. Time Needed to Inform All Employees【自顶向下,自底向上(记忆化搜索+空间优化+迭代)】中等

本文属于「征服LeetCode」系列文章之一,这一系列正式开始于2021/08/12。由于LeetCode上部分题目有锁,本系列将至少持续到刷完所有无锁题之日为止;由于LeetCode还在不断地创建新题,本系列的终止日期可能是永远。在这一系列刷题文章…