Python+Streamlit aggrid+MongoDB GridFS构建低代码文档管理应用(文档查询下载实用篇)
Posted 肖永威
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Python+Streamlit aggrid+MongoDB GridFS构建低代码文档管理应用(文档查询下载实用篇)相关的知识,希望对你有一定的参考价值。
1. Sreamlit aggrid简介
Sreamlit aggrid是Streamlit的Ag-Grid组件的实现,在Python Streamlit框架下,更加灵活的使用表格,包括分组、排序、编辑、选择行等等,功能较为强大,补充Streamlit表格处理弱的情况,结合Streamlit可视化图,方便数据分析人员实现可视化数据分析报告。
ag-grid是一款功能和性能强大外观漂亮的表格插件,ag-grid几乎能满足你对数据表格所有需求。固定列、拖动列大小和位置、多表头、自定义排序等等各种常用又必不可少功能。关于收费的问题,绝大部分应用用免费的社区版就够了,ag-grid-community社区版一样功能强大。
中文API文档: https://www.itxst.com/ag-grid/tutorial.html
Sreamlit aggrid资源地址如下:
- https://github.com/PablocFonseca/streamlit-aggrid
- https://streamlit-aggrid.readthedocs.io/en/docs/
使用Streamlit-aggrid,直接pip安装即可:
pip install -i https://pypi.tuna.tsinghua.edu.cn/simple Streamlit-aggrid
2. 文档查询下载功能实践
2.1. 功能描述
根据关键字、文档分类、时间、搜索等方法,查询返回的结果用表格呈现,往往存在很多行数据的情况,需要从中选择目标文档。通过选中行,获取所在行的文档名称,或者文档ID。再依据文档名称(或文档ID),从Mongo DB数据库中获取文件,下载到本地。界面效果如下所示。
2.2. 代码实现
2.2.1. 查询文件
在Mongo DB数据库中,给出如下结构:
本实践案例,先以简单查询为例,直接查询全量集合(表)中的数据(可以自行加模糊查询等)。
# 数据库,集合名称
def queryfile(db,collectionname):
collection = db[collectionname]
query_dict =
col_name = "_id":0 ,"filename":1 ,"length":1,'classic':1,'keyword':1,'descripte':1,'length':1,'uploadDate':1,'filetype':1
df = pd.DataFrame(list(collection.find(query_dict,col_name)))
rencolnames = "filename":'文件名称' ,"length":'文件长度','classic':'文件分类','keyword':'关键字','descripte':'文件描述','uploadDate':'上传日期','filetype':'文件类型'
colnames = ['文件名称' ,'文件长度','文件分类','关键字','文件描述','上传日期','文件类型']
df = df.rename(columns=rencolnames)
df = df[colnames]
return df
2.2.2. 构造可选中行的表格
构造可选中行的表格涉及到两个函数,分别是渲染表格的AgGrid()和定义表格操作的GridOptionsBuilder类。
-
AgGrid是用于渲染页面表格的主要函数。详见“https://streamlit-aggrid.readthedocs.io/en/docs/AgGrid.html”
-
GridOptionsBuilder类可用于帮助定义gridOptions字典。尽管网格的配置可以通过传递字典来完成,但建议使用GridOptionsBuilder。https://streamlit-aggrid.readthedocs.io/en/docs/GridOptionsBuilder.html
实践案例,定义单行选择表,选中行的数据,可以按字段/关键字读取出来。参考官方样例源代码见streamlit-aggrid examples。
# 定义单行选择表,选中行的数据,可以按字段/关键字读取出来
def aggrid(df):
gb = GridOptionsBuilder.from_dataframe(df)
selection_mode = 'single' # 定义单选模式,多选为'multiple'
enable_enterprise_modules = True # 设置企业化模型,可以筛选等
#gb.configure_default_column(editable=True) #定义允许编辑
return_mode_value = DataReturnMode.FILTERED #__members__[return_mode]
gb.configure_selection(selection_mode, use_checkbox=True) # 定义use_checkbox
gb.configure_side_bar()
gb.configure_grid_options(domLayout='normal')
gb.configure_pagination(paginationAutoPageSize=True)
gridOptions = gb.build()
update_mode_value = GridUpdateMode.MODEL_CHANGED
grid_response = AgGrid(
df,
gridOptions=gridOptions,
data_return_mode=return_mode_value,
update_mode=update_mode_value,
enable_enterprise_modules=enable_enterprise_modules,
)
df = grid_response['data']
selected = grid_response['selected_rows']
return df, selected
2.2.3. 下载文档
# 文件下载
def filedownload():
st.header("文档查询下载")
st.markdown('查询数据库中的文档,显示文档列表。')
db = connectmongo()
df= queryfile(db,'books.files')
df,selected = aggrid(df)
if (len(selected)>0):
filenameList = selected[0]
inputfilename=filenameList['文件名称']
else:
inputfilename='请选择文件名'
file_coll = 'books'
with st.form(key='filename'):
filename=st.text_input('输入文件名',inputfilename)
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('下载文件', file_data,file_name = filename)
其他相关代码详见博文《Python+Streamlit+MongoDB GridFS构建低代码文档管理应用(Demo篇)》
参考:
[1].heianduck. Streamlit(四) - st.dataframe. CSDN博客. 2022-01
[2]. 肖永威. Python+Streamlit+MongoDB GridFS构建低代码文档管理应用(Demo篇). CSDN博客. 2022.04
以上是关于Python+Streamlit aggrid+MongoDB GridFS构建低代码文档管理应用(文档查询下载实用篇)的主要内容,如果未能解决你的问题,请参考以下文章
Streamlit应用程序使用Streamlit-Authenticator进行用户的安全身份验证实践
Streamlit应用程序使用Streamlit-Authenticator进行用户的安全身份验证实践