Python+Streamlit+MongoDB GridFS构建低代码文档管理应用(Demo篇)

Posted 肖永威

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Python+Streamlit+MongoDB GridFS构建低代码文档管理应用(Demo篇)相关的知识,希望对你有一定的参考价值。

1. 文档管理概述

随着工作经历增加,积累的资料、文档早已“汗牛充栋”了,每每整理非常耗费时间和精力。多年来,一直想自己做些个人知识管理,也使用了些工具,但是基本是有始无终。

最近,又开始研究较新的业务领域,文档与知识梳理迫在眉睫,因此,自己动手做个低代码的个人知识管理、分析工具。

Gartner将信息治理定义为决策权的规范和责任框架,以确保在评估、创建、存储、使用、归档和销毁信息时适当的行为。它包括过程、角色和政策、标准和度量,确保有效和有效地利用信息,使组织实现其目标。

个人知识管理首先从基本的内容管理开始,内容管理工具的基本功包括,添加文档、上传文档、下载文档、删除文档等,进行文档的全生命周期管理,并涵盖对文档进行各种维度的分类,提取关键字和概略说明、建立引用关系等。

2. 技术架构

低代码文档管理应用采用B/S架构,Web服务由Python Streamlit所依赖的tornado提供,Web框架是Streamlit。

文件存储使用MongoDB GridFS,直接存储在数据库中,与操作系统的文件系统无关。

2.1. 文档数据库MongoDB概述

2.1.1. 简介

MongoDB是一个基于分布式文件存储的数据库。MongoDB是一个介于关系数据库和非关系数据库之间的产品,是非关系数据库当中功能最丰富,最像关系数据库的。

GridFS是MongoDB中存储和查询超过BSON文件大小限制(16M)的规范,GridFS使用两个集合保存数据,一个集合存储文件块,另外一个存储文件元数据。

2.1.2. 存储管理

MongodB使用两个集合来存储GridFS文件,一个是fs.files,另一个是fs.chunks。

  • fs.files这个集合中存储的是每一个上传到数据库的文档的信息。
  • fs.chunks这个集合存储的是上传文件的内容。一个chunk相当于一个文档(大文件被拆分成多个有序的chunk)。

2.2. 低代码Web数据可视化框架Streamlit概述

2.2.1. 什么是Streamlit?

让python代码快速生成web app是很多AI算法工程师们的需求,2019年新兴的这个streamlit项目能帮你解决类似的问题。Python应用程序框架Streamlit,是一个开源的Python库,在github(https://github.com/streamlit/streamlit)上超过17.2千颗stars(截止2022.1.11),利用Streamlit可以快速构建机器学习应用和高级数据分析可视化的用户界面。

Streamlit官方帮助文档为https://docs.streamlit.io/。
使用简单的pip安装:
pip install -i https://pypi.tuna.tsinghua.edu.cn/simple Streamlit

2.2.2. Web框架

文档管理使用Streamlit的左右结构,左侧为菜单区,右侧为具体操作界面。

import streamlit as st
def navigation_bar():
    st.set_page_config(layout="wide") #设置屏幕展开方式,宽屏模式布局更好
    st.sidebar.write('文档管理导航栏')
    
        
    add_selectbox = st.sidebar.radio(
        "文档管理",
        ("上传文档", "下载文档", "文档查询")
    )
    
    if add_selectbox == '上传文档':
        fileupload()
    elif add_selectbox == '下载文档':
        filedownload()  
    elif add_selectbox == '文档查询':
        querybooks()  
                                         
    return add_selectbox

def main():
    navigation_bar()

if __name__ == '__main__':
    main()

3. 文件上传下载

Streamlit输入组件中,包括了文件上传下载组件,分别是st.file_uploader、st.download_button。

3.1. 文件上传

文件上传功能使用Streamlit显示文件上载程序小部件st.file_uploader。

默认情况下,上传的文件限制为200MB。您可以使用服务器对此进行配置。maxUploadSize配置选项。有关如何设置配置选项的更多信息,请参阅https://docs.streamlit.io/library/advanced-features/configuration#set-配置选项



代码如下:

def fileupload():
    
    classic = st.selectbox('文档类别',['政策法规','文学作品','技术资料'])
    filekeyword = st.text_input('文档关键字','AI')
    filedesc = st.text_input('文档概述','简略描述文档')
    uploaded_file = st.file_uploader("Choose a file")
    if uploaded_file is not None:
        # To read file as bytes:
        bytes_data = uploaded_file.getvalue()
        filename = uploaded_file.name
        filetype = uploaded_file.type

        db = connectmongo()
        cn = 'books'
        re = filetoGridFS(db, cn, filename, filetype ,classic, filekeyword, filedesc,bytes_data) 

3.2. 文件保存到MongoDB GridFS

def connectmongo():
    database_url = 'mongodb://localhost:27017/bigbooks'
    client = pymongo.MongoClient(database_url)
    db = client['BigBooks']
    
    return db
# 文件写入MongodbGridFS
def filetoGridFS(db, file_coll, file_name,filetype,classic, filekeyword, filedesc, stringdata):
    filter_condition = "filename": file_name,"filetype":filetype,"classic":classic,"keyword":filekeyword, "descripte":filedesc
    gridfs_col = GridFS(db, collection=file_coll)
    file_ = "0"
    query = "filename":"","filetype":""
    query["filename"] = file_name
    query["filetype"] = filetype
            
    if gridfs_col.exists(query):
        return '已经存在该文件'
    else:
        file_ = gridfs_col.put(data=stringdata, **filter_condition)  # 上传到gridfs
   
    return file_ 

3.3. 文件下载

文件下载功能使用Streamlit显示文件下载按钮程序小部件st.download_button。

当您希望为用户提供一种直接从应用程序下载文件的方式时,这非常有用。

请注意,要下载的数据在用户连接时存储在内存中,因此最好将文件大小保持在几百MB以下,以节省内存。

输入文件名称方式,查找文件并下载。

查询文件,并把文件加载到内存中,接着显示出下载按钮。

使用下载按钮“Download files”下载文档到本地。

参考代码:

def filedownload_tmp():
    db = connectmongo()
    file_coll = 'books'
    
    with st.form(key='filename'):
        filename=st.text_input('输入文件名')
        submit_button = st.form_submit_button(label='下载文件')            
    
    if submit_button:
        gridfs_col = GridFS(db, collection=file_coll)
        file_data = gridfs_col.get_version(filename=filename, version=-1).read()
        st.download_button('Download file', file_data,file_name = filename) 

实用化应用实践,请关注后续内容。

参考:

[1]. MongoDB GridFS 怎么用. MongoDB中文社区. 2021-01-26
[2]. 肖永威. 初识内容管理(一).CSDN博客. 2017.06
[3]. 肖永威. 信息治理——初识内容管理(二).CSDN博客. 2017.09
[4]. 肖永威. Python数据分析师使用低代码Streamlit实现Web数据可视化方法——入门篇. CSDN博客. 2022.01
[5]. 肖永威.基于Python使用MongoDB及其GridFS进行文档管理. CSDN博客. 2019.09

以上是关于Python+Streamlit+MongoDB GridFS构建低代码文档管理应用(Demo篇)的主要内容,如果未能解决你的问题,请参考以下文章

Streamlit应用程序使用Streamlit-Authenticator进行用户的安全身份验证实践

Streamlit应用程序使用Streamlit-Authenticator进行用户的安全身份验证实践

如何使用python在streamlit和plotly中创建列?

上传 .gpx 文件 Streamlit Python

无法安装 streamlit 库 [关闭]

无 在 Python 中运行 streamlit 时出现类型错误