flask_admin基本使用

本文档详细介绍了如何使用Flask_Admin库来创建和定制管理界面,包括初始化空的管理界面、添加模型类视图、向索引页添加内容、自定义内置视图、分组视图等。通过实例展示了如何实现CRUD操作、设置页面样式、限制字段选项、自定义模板以及创建自定义视图。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

  • 地址: https://flask-admin.readthedocs.io/en/latest/

一: Flask_Admin基础功能

1.1: 初始化空的管理界面:

  • 主题地址: http://bootswatch.com/3/
# coding=utf-8
from flask import Flask
from flask_admin import Admin

app = Flask(__name__)

# 设置Flask_admin样式
app.config['FLASK_ADMIN_SWATCH'] = 'cerulean'
# 初始化admin对象,绑定app对象,指定模板
admin = Admin(app, name='microblog', template_mode='bootstrap3')

app.run()
  • 运行效果:
    在这里插入图片描述

1.2: 添加模型类视图:

  • 1:使用FLASK_SQLAlchemy创建一个模型类: 设备版本表

    # coding=utf-8
    from sqlalchemy.orm import registry
    from sqlalchemy import Column, String, Integer
    
    
    my_registry = registry()
    # 获取模型类基类
    Base = my_registry.generate_base()
    
    
    class UpdateDeviceVersionClass(Base):
        """
        更新设备版本表
        """
        __tablename__ = "update_device_version"
        id = Column(Integer, autoincrement=True, primary_key=True, unique=True, nullable=False)
        device_name = Column(String(64), nullable=False)
        rule_version = Column(String(32), nullable=True)
        ioc_version = Column(String(32), nullable=True)
        sys_version = Column(String(32), nullable=True)
        product_id = Column(Integer, nullable=False)
    
    
  • 2: 添加模型类视图:

    • 该模型类视图,拥有CRUD的全部属性。
    # coding=utf-8
    from flask import Flask
    from flask_admin import Admin
    from flask_admin.contrib.sqla import ModelView
    from sqlalchemy import create_engine
    from sqlalchemy.orm import Session
    
    import config
    from modules import UpdateDeviceVersionClass
    
    app = Flask(__name__)
    
    # 设置Flask_admin样式
    app.config['FLASK_ADMIN_SWATCH'] = 'cerulean'
    # 初始化admin对象,绑定app对象,指定模板
    admin = Admin(app, name='microblog', template_mode='bootstrap3')
    engin = create_engine(config.DB_URI)
    session = Session(engin)
    # 直接构造模型类视图
    admin.add_view(ModelView(UpdateDeviceVersionClass, session))
    app.run()
    
  • 效果:

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-70aXSR8S-1631091770715)(C:\Users\renshanwen\AppData\Roaming\Typora\typora-user-images\1631069792476.png)]

1.3: 向索引页添加内容:

  • 在templates/admin/index.html中添加下面的内容:

    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title></title>
    </head>
    <body>
    {% extends 'admin/master.html' %}
    {% block body %}
      <p>请联系管理员:任善文</p>
    {% endblock %}
    </body>
    </html>
    
  • 索引页效果:

在这里插入图片描述

1.4: 自定义内置视图:

  • 1: 再次定义一个模型类,继承于ModelView。

    • 设置取消删除权限,并且设置每页数量为50。
    # 注意导包,千万不要导错。
    from flask_admin.contrib.sqla import ModelView
    class UpdateDeviceVersionModuleClass(ModelView):
        """
        设置不能删除,每页50字段
        """
        can_delete = False
        page_size = 50
    
    • 使用这个内置视图去封装原来的模型类,然后加入到视图集中。
    # 直接构造模型类视图
    admin.add_view(UpdateDeviceVersionModuleClass(UpdateDeviceVersionClass, session))
    
  • 2: 自定义视图有那些属性呢?

    # 是否能创建
    can_create = False
    # 是否能修改
    can_edit = False
    # 是否可以删除
    can_delete = False
    # 设置查看更多详细信息
    can_view_details = True
    # 删除某列不显示
    column_exclude_list = ['password', ]
    # 使用搜索栏,用于过滤指定的字段
    column_searchable_list = ['name', 'email']
    # 搜索中的限制字段
    column_filters = ['country']
    # 弹窗的形式展示创建和编辑
    create_modal = True
    edit_modal = True
    
  • 3: 案例: 设置可以查看更多信息,不显示ID字段, 设置过滤字段sys_version,设置创建和编辑都是弹窗形式展示。

    class UpdateDeviceVersionModuleClass(ModelView):
        """
        设置不能删除,每页50字段
        """
        can_delete = False
        page_size = 50
        column_searchable_list = ['device_name']
        column_exclude_list = ['id']
        column_filters = ['sys_version']
        create_modal = True
        edit_modal = True
        can_view_details = True
    
    • 效果:

在这里插入图片描述在这里插入图片描述

  • 4: 限制文本字段的选项:

    • 案例: 限制产品的ID只能是1, 2, 3, 4。

      class UpdateDeviceVersionModuleClass(ModelView):
      	...
          form_choices = {
              'product_id': [
                  (1, "1"), (2, "2"), (3, "3"), (4, "4")
              ]
          }
      
    • 效果:

      [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-bH9C2SMo-1631091770721)(C:\Users\renshanwen\AppData\Roaming\Typora\typora-user-images\1631085079263.png)]

  • 5: 从创建和删除表单中删除某些字段,不让用户添加

    • 案例: 不让用户添加ID字段。

      form_excluded_columns = ['id']
      
  • 6: 配置文件导出:

    • 案例: 配置导出文件:

      can_export = True
      
    • 效果:
      在这里插入图片描述

  • 7: 指定表单的相关参数:

    • 案例: 设置device_name表单名字为device,参数必传。

          form_args = {
              "device_name": {
                  "label": "device",
                  'validators': [required()]
              }
          }
      

      [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-SnFl0zO2-1631091770723)(C:\Users\renshanwen\AppData\Roaming\Typora\typora-user-images\1631085850135.png)]

  • 8:更改表单的样式:

    • 案例: 设置device_name的样式为红色:

          form_widget_args = {
              'device_name': {
                  'rows': 10,
                  'style': 'color: red'
              }
          }
      
    • 效果:

      [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-qrqVlDSZ-1631091770725)(C:\Users\renshanwen\AppData\Roaming\Typora\typora-user-images\1631086135331.png)]

  • 9: 加载相关对象模型:

    form_ajax_refs = {
        'user': {
            'fields': ['first_name', 'last_name', 'email'],
            'page_size': 10
        }
    }
    
    • 对相关对象加载的数据进行过滤:
    form_ajax_refs = {
        'active_user': QueryAjaxModelLoader('user', db.session, User,
                                     filters=["is_active=True", "id>1000"])
    }
    

1.5: 分组视图:

  • 添加视图的时候,使用category参数,可以将视图组合在一起。

    • 案例:

      新增一个设备信息的模型类和视图类:

      class UnifyDeviceClass(Base):
          """
          设备信息模型类
          """
          __tablename__ = 'unify_device'
          # 表结构
          id = Column(Integer, autoincrement=True, primary_key=True, unique=True, nullable=False)
          name = Column(String(255), nullable=False)
          serial = Column(String(255), nullable=False)
          product_id = Column(Integer, nullable=True)
          ip = Column(String(64), nullable=True)
          group_id = Column(Integer, nullable=True)
          maker_id = Column(Integer, nullable=True)
          rule_version = Column(String(32), nullable=True)
          ioc_version = Column(String(32), nullable=True)
          sys_version = Column(String(32), nullable=True)
          beat_time = Column(Integer, nullable=True)
          create_time = Column(Integer, nullable=False)
          is_delete = Column(Integer, nullable=True)
         
      class UnifyDeviceView(ModelView):
          can_delete = False
          page_size = 50
      
    • 将这两个视图,分成一个组。

    admin.add_view(UpdateDeviceVersionModuleClass(UpdateDeviceVersionClass, session, category="module"))
    admin.add_view(UnifyDeviceView(UnifyDeviceClass, session, category="module"))
    
    • 效果:

      [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-KgtPUhPG-1631091770726)(C:\Users\renshanwen\AppData\Roaming\Typora\typora-user-images\1631087036196.png)]

  • 菜单中可以加入超链接:

    • 例如: 加入一个超链接,名为Home Page直接链接到首页:

      admin.add_link(MenuLink(name='Home Page', url='/admin', category='Links'))
      
    • 效果:

      [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-RU2kFIi7-1631091770726)(C:\Users\renshanwen\AppData\Roaming\Typora\typora-user-images\1631087816611.png)]

  • 下拉列表中再嵌套一个相关视图:

    admin.add_sub_category(name="Links", parent_name="Team")
    

1.6: 添加自己的视图:

  • 1: 自定义视图:

    from flask_admin import BaseView, expose
    
    class AnalyticsView(BaseView):
        @expose('/')
        def index(self):
            return self.render('analytics_index.html')
    
  • 2: 自定义html文件

    • 注意:必须将这个自定义的html放在templates下面,而不能放在admin下面。
    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>Analytics</title>
    </head>
    <body>
    {% extends 'admin/master.html' %}
    {% block body %}
      <p>Here I'm going to display some data.</p>
    {% endblock %}
    </body>
    </html>
    

1.7: 覆盖内置视图:

from flask_admin.contrib.sqla import ModelView

# Flask and Flask-SQLAlchemy initialization here

class UserView(ModelView):
    @expose('/new/', methods=('GET', 'POST'))
    def create_view(self):
    """
        Custom create view.
    """

    return self.render('create_user.html')

1.8: 内置模板:

  • 在内部,我们所有的模板都是来自于: admin/master.html模板。

  • 我们经常要扩展出: list.html, create.html,edit.html三个模板。

  • 案例: 拓展一个编辑模板: templates/microblog_edit.html

    {% extends 'admin/model/edit.html' %}
    
    {% block body %}
        <h1>MicroBlog Edit View</h1>
        {{ super() }}
    {% endblock %}
    

    在使用模板的视图中增加编辑模板的属性:

    class MicroBlogModelView(ModelView):
        edit_template = 'microblog_edit.html'
        # create_template = 'microblog_create.html'
        # list_template = 'microblog_list.html'
    
### 使用 Flask-Profiler 进行 Flask 应用程序的性能监控 Flask-Profiler 是一个用于监控和分析 Flask 应用程序性能的工具。它可以帮助开发者识别请求处理中的瓶颈,优化代码,并提高应用程序的整体性能。以下是关于如何使用 Flask-Profiler 的详细说明: #### 安装 Flask-Profiler 首先需要安装 Flask-Profiler 库,可以通过 pip 工具完成安装: ```bash pip install flask-profiler ``` #### 配置 Flask-Profiler 在 Flask 应用程序中集成 Flask-Profiler 时,需要进行一些配置。以下是一个基本的配置示例: ```python from flask import Flask from flask_profiler import Profiler app = Flask(__name__) # Flask-Profiler 配置 app.config["FLASK_PROFILER"] = { "enabled": app.config["DEBUG"], # 是否启用 Flask-Profiler "storage": { "engine": "sqlalchemy", # 数据存储引擎 }, "basicAuth": { "enabled": True, # 是否启用基本身份验证 "username": "admin", # 用户名 "password": "secret" # 密码 }, "ignore": ["^/static/.*"] # 忽略的 URL 模式 } profiler = Profiler(app) ``` #### Flask-Profiler 的主要功能 1. **请求跟踪**:Flask-Profiler 可以记录每个请求的执行时间、SQL 查询次数以及模板渲染时间等信息[^2]。 2. **性能报告**:生成详细的性能报告,帮助开发者了解哪些请求或操作消耗了较多的时间。 3. **SQL 查询分析**:提供 SQL 查询的详细信息,包括查询次数、执行时间和查询语句本身[^3]。 #### 启动与访问 启动 Flask 应用程序后,可以通过浏览器访问 Flask-Profiler 提供的界面,默认路径为 `/flask-profiler`。例如: ``` http://localhost:5000/flask-profiler/ ``` 登录时需要使用配置文件中指定的基本身份验证凭据(如上述示例中的用户名 `admin` 和密码 `secret`)。 #### 注意事项 - 确保仅在开发环境中启用 Flask-Profiler,避免在生产环境中暴露敏感信息。 - 根据实际需求调整忽略的 URL 模式,避免对静态资源或其他无关请求进行不必要的性能分析[^4]。 ```python @app.route("/example") def example(): # 示例视图函数 return "Hello, Flask-Profiler!" ```
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

奈何桥上的幽灵野草

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值