• 基于Flask_admin库,编写个人工作平台详述。


    一、个人工作平台展示

    二、搭建过程

    1、运行Flask-admin库样例custom-layout

    下载代码:https://github.com/flask-admin/flask-admin.git

    选择样例工程:flask-admin\examples\custom-layout

    运行成功后效果如下图:

    2、修改Home主页内容

    Home内容是在templates/admin/index.html中定义的,可按自己效果修改对应,如下

    1. {% extends 'admin/master.html' %}
    2. {% block body %}
    3. {{ super() }}
    4. <div class="row">
    5.     <h1>个人工作事务平台</h1>
    6.     <class="lead">
    7.         Created by 鹏哥贼优秀
    8.     </p>
    9.     <p>
    10.         记录个人&工作事务,方便管理跟踪。
    11.     </p>
    12.     <class="btn btn-primary" href="/"><class="glyphicon glyphicon-chevron-left"></i> Back</a>
    13. </div>
    14. {% endblock body %}

    解释:

    (1)extends 'admin/master.html' 这里可能会疑问,为什么在admin目录下,并没有master.html文件。

    这是因为master.html是定义在flask-admin库中,当前只是引用而已。如果你想修改master.html内容,可至如下路径进行修改:python安装目录\site-packages\flask_admin\templates\bootstrap3\admin\master.html

    3、修改User/Page界面内容

    由于原app.py脚本里自带数据库生成命令,执行成功后会在以下路径生成sqlite数据库(custom-layout\instance\sample_db.sqlite)。因此可以直接修改已有数据库表结构即可。

    本人使用的数据库工具是:Navicat

    (1)修改数据表结构

    使用数据库工具重新设计表结构会比用python代码实现更方便

    (2)修改数据表对应代码(增加数据库类和增加视图)

    修改后的视图功能有:字段必填、字段设置日历图、字段默认值设置、富文本设置、下拉框设置、支持排序、支持类型搜索。对应效果如下图

    对应代码如下:

    1. # 增加数据库类
    2. class Work(db.Model):
    3.     id = db.Column(db.Integer, primary_key=True)
    4.     title = db.Column(db.Unicode(64), nullable=False)  # 字段必填
    5.     owner = db.Column(db.Unicode(64))
    6.     time = db.Column(db.DateTime, default=datetime.datetime.now())  # 字段设置默认值
    7.     priority = db.Column(db.Unicode(64))
    8.     content = db.Column(db.Text)
    9.     def __unicode__(self):
    10.         return self.name
    11. # 增加视图
    12. class WorkAdmin(CustomView):
    13.     form_overrides = dict(content=CKEditorField)  # 重写表单字段,将 text 字段设为 CKEditorField
    14.     column_searchable_list = ('title''owner''content')
    15.     column_filters = ('time''priority')
    16.     form_extra_fields = {
    17.         'priority': form.Select2Field('priority', choices=[(0'高'), (1'中'), (2'低')])
    18.     }
    19. Add views
    20. admin.add_view(WorkAdmin(Work, db.session, name='工作待办'))

    下面分别解释下各自小功能点的实现。

    A、字段必填:关键是在定义字段时添加nullable=False

    title = db.Column(db.Unicode(64), nullable=False)
    

    B、字段设置日历图:将字段类型定义为db.DateTime,系统会自动设置成日历图格式

    time = db.Column(db.DateTime, default=datetime.datetime.now())  # 字段设置默认值
    

    C、设置默认值:关键添加default=XXXX

    time = db.Column(db.DateTime, default=datetime.datetime.now()) # 字段设置默认值

    D、下拉框设置:在展示视图代码中添加form_extra_fields类。

    1. from flask_admin import form
    2. form_extra_fields = {
    3. 'priority': form.Select2Field('priority', choices=[(0'高'), (1'中'), (2'低')])
    4. }

    E、富文本框设置

    这里有3处要修改:修改app.py和edit.html 、create.html

    (1)在app.py中重定义content字段的类型

    form_overrides = dict(content=CKEditorField) # 重写表单字段,将 text 字段设为 CKEditorField

    (2)在edit.html和create.html的最后添加以下代码

    1. {% block tail %} 
    2.     {{ super() }}
    3.     {{ ckeditor.load() }} 
    4. {% endblock %}

    F、搜索功能设置

    1. column_searchable_list = ('title''owner''content')  # 支持对应字段的精确、模糊匹配搜索
    2. column_filters = ('time''priority') # 支持增加过滤器

    G、修改视图名称

    添加视图时默认是用数据库表名,可以通过设置name=xxx来修改视图名称

    admin.add_view(WorkAdmin(Work, db.session, name='工作待办'))

    4、超链接视图添加

    这里使用的是Flask-admin库自带的MenuLink方法,但是MenuLink方法生成的超链接点击后,无法生成新页面进行跳转,而是基于本界面跳转到新url。

    1. from flask_admin.base import MenuLink
    2. admin.add_link(MenuLink(name='百度', url='https://www.baidu.com/', category='链接'))

    因此,如果是为了实现跳转到新界面的效果,需要自定义视图。详见第5节。

    5、自定义视图

    app.py脚本添加视图定义代码:

    1. from flask_admin.base import BaseView, expose
    2. class MyView(BaseView):
    3.     def __init__(self, url=None, name=None,category=None, endpoint=None):
    4.         super(MyView, self).__init__()
    5.         self.url = url
    6.         self.name = name
    7.         self.category = category
    8.         self.endpoint = endpoint
    9.     @expose('/')
    10.     def index(self):
    11.         return self.render('mylink.html', myurl=self.url)
    12. # 添加自定义视图
    13. admin.add_view(MyView(url='http://www.google.cn/', name='谷歌',endpoint='1'))

    mylink.html代码如下:

    1. {% extends 'admin/master.html' %}
    2. {% block body %}
    3. <body>
    4. <script LANGUAGE="javascript">
    5. window.open('{{ myurl }}','_blank')
    6. </script>
    7. <p>
    8.     正在前往:{{ myurl }}
    9. </p>
    10. </body>
    11. {% endblock body %}

    这里补充说明下,MyView类中为什么要继承父类BaseView的url、name、category、endpoint参数

    url:这个不用解释,是我要打开的新网页网址

    name:为了方便在界面上显示链接名称

    category:是为了后续的目录管理,详见第6节

    endpoint:是为了管理区分不同子页面,若endpoint='1',则对应网址是:http://127.0.0.1:5000/admin/1/

    6、目录管理

    示例代码:

    1. admin.add_link(MenuLink(name='百度', url='https://www.baidu.com/', category='链接'))
    2. # 添加自定义视图
    3. admin.add_view(MyView(myurl='https://flask-admin.readthedocs.io/en/v1.6.0/', name='Flask-Admin官方文档', endpoint='1', category='链接'))
    4. admin.add_view(MyView(myurl='http://www.google.cn/', name='谷歌', endpoint='2', category='链接'))

    从这里可以看出,当category相同时,flask-admin框架会自动将所有视图进行合并到同一目录下。

    如果想要添加子目录,

    admin.add_sub_category(name="子目录", parent_name="链接")
    

    7、文件管理

    示例代码:

    1. # 文件管理
    2. from flask_admin.contrib.fileadmin import FileAdmin
    3. path = 'E:\\'
    4. admin.add_view(FileAdmin(path, 'file', name='文件管理'))

    这里可以自定义path路径,从而实现文件管理


    三、总结

    至此,当前所有功能已经能满足本人平时工作管理的要求了,因此没有再深入flask-admin其他特性。

    如果你有兴趣可以继续研究使用更多功能,比如用户登录管理、内容导出、与其他数据库配合使用等,网上也有很多相关大神总结可以参考。

    四、FAQ

    1、执行报错 Working outside of application context.

    1. # Create in-memory database
    2. app.config['DATABASE_FILE'= 'sample_db.sqlite'
    3. app.config['SQLALCHEMY_DATABASE_URI'= 'sqlite:///' + app.config['DATABASE_FILE']
    4. app.config['SQLALCHEMY_ECHO'= True
    5. # 新增以下代码
    6. app.app_context().push()

    2、自定义视图定义时报错:Attempted to instantiate admin view MyView without default view

    1. # 原代码
    2. from flask_admin.base import BaseView, expose
    3. class MyView(BaseView):
    4.     def __init__(self, name=None, category=None, endpoint=None, url=None):
    5.         super(MyView, self).__init__()
    6.         self.url = url
    7.         self.name = name
    8.         self.category = category
    9.         self.endpoint = endpoint
    10.     @expose('/link')
    11.     def index(self):
    12.         return self.render('mylink.html', myurl=self.url)

    原先在自定义MyView视图时,是想直接继承父类BaseView,但是在运行时报错说defalut view未实例。后面查看官方指导,发现在使用expose装饰器时,是基于根目录,即

    @expose('/')

    当前暂未清楚为什么不能基于/link目录,猜测flask-admin的Http目录是http://127.0.0.1:5000/admin/,如果变成http://127.0.0.1:5000/link则需要自己写个默认视图。

    3、打开新页面不生效

    原先这里是想打开百度网站的,并且{{myurl}}的值也的确是www.baidu.com

    1. {% extends 'admin/master.html' %}
    2. {% block body %}
    3. <body>
    4. <script LANGUAGE="javascript">
    5. window.open({{ myurl }},'_blank')
    6. </script>
    7. <p>
    8.     正在前往:{{ myurl }}
    9. </p>
    10. </body>
    11. {% endblock body %}

    但实际效果时,并没有弹出新的界面。

    最后发现这里代码有误

    window.open({{ myurl }},'_blank')

    应该是:

    window.open('{{ myurl }}','_blank')

    五、参考

    1、Flask-admin官方指导:https://flask-admin.readthedocs.io/en/v1.6.0/

    2、Flask-admin中文指导:http://flask123.sinaapp.com/article/57/

    3、在 Flask-Admin 中集成富文本编辑器 CKEditor:CSDN搜索即可

  • 相关阅读:
    断链在平曲线计算中的处理——短链篇
    b2b.ccb.com:443 需要你的凭据
    LeetCode 290. Word Pattern
    godot引擎学习4
    [英语基础]形容词
    java基于springboot+mvc的高校网课在线学习作业管理系统 elementui
    数据结构--》掌握数据结构中的排序算法
    java开发手册-06工程结构
    为什么重写Equals方法要重写HashCode方法
    serveless 思想 Midway.js 框架使用教程(一)
  • 原文地址:https://blog.csdn.net/yuzipeng/article/details/127462392