【Flask项目】文件分享系统(二)

前一篇文章简单分析了基于Flask的文件分享系统,功能设计的很简单,就是浏览目录,支持文件的上传和下载,那么用flask该如何来实现呢,其实也很简单。
一个Flask程序必须包含实例、路由、视图函数、响应,才能正常运行起来,本文也按这个顺序讲解,如果对Flask是什么不清楚的朋友请去看我写的前几篇关于flask的文章。

实例

生成实例的方式很简单,代码如下

from flask import Flask
app = Flask(__name__, static_folder='./static', template_folder='./templates')

看过我写的《一个完整的Flask程序》一文的朋友可能会发现,这里的Flask实例中还添加了static_folder='./static', template_folder='./templates'参数,这两个参数是用来指定静态文件和模板文件路径的,指定后,flask会从这两个路径去寻找静态文件和html的模板。


读取目录内容

文件共享系统,首先要实现的就是读取目录内容,并区分出文件和文件夹并返回给浏览器,代码如下

@app.route('/data/')
@app.route('/data/<path:subdir>/')
def index(subdir=''):if subdir == '':path = rootdir + 'data'else:path = rootdir + 'data' + os.sep + subdir# 判断如果是文件则下载if os.path.isfile(path):return(redirect(url_for('download', filepath=subdir)))# 显示文件、文件夹,计算文件大小dirlist = []filelist = []for i in os.listdir(path):if os.path.isdir(path + os.sep + i):dirlist.append(i + os.sep)else:filesize = os.path.getsize(path + os.sep + i)if (filesize / 1024) > 1000:filesize = str(round(float(filesize / 1024 /1024),2)) + 'MB'elif (filesize / 1024) < 1000:filesize = str(round(float(filesize / 1024),2)) + 'KB'filelist.append({"name":i, "size":filesize})return(render_template('index.html', currentpath=subdir, dirlist=dirlist, filelist=filelist))

以上代码中,将目录的浏览和文件的下载和在了一起,如果用户点击的是文件,就跳转到下载的视图函数,如果点击的是目录,则重新读取目录中的内容。

下面来详细解析下代码,前4行用于设置要读取的目录路径,然后判断浏览器传回的路由是否为文件,如果是文件则重定向到下载的视图函数,这里就要引入两个新的知识点,redirect()和url_for()函数,这两个函数是Flask中提供,使用from flask import redirect, url_for进行导入。

redirect函数用于重定向到另一个URL,它接收一个URL作为参数,然后返回一个重定向的响应对象,浏览器接到重定向的响应后,会重新发起新的URL的请求。这里的URL我们就需要用到url_for函数,这个函数可以让我们通过视图函数的名称和参数生成对应的URL地址。

接下来我们再看后面的代码,dirlist用于存储目录路径,filelist用于存储文件目录路径,后面的for循环用于读取目录下的所有文件和文件夹名称,如果是文件还要计算下文件的大小,然后将目录的路径存到dirlist中,将文件的路径存到filelist中,然后使用render_template渲染网页后返回给浏览器。这里要讲下render_template函数,也是flask提过的一个内部函数,render_template函数用于将HTML模板渲染成最终的HTML页面并返回给用户,其参数就是要渲染的html模板,和html中需要用到的变量,然后render_template函数使用变量在html模板中进行渲染,再返回给用户。使用from flask import render_template来导入这个函数。

到此,读取目录内容的视图函数就写好了。


下载文件

上面提到,如果传过来的是文件路径,则要重定向到文件下载的视图函数,其代码如下

@app.route('/download/<path:filepath>/')
def download(filepath):fullpath = rootdir + 'data' + os.sep + filepathfilename = fullpath.split(os.sep)[-1]dirpath = fullpath[:-len(filename)]return(send_from_directory(dirpath, filename, as_attachment=True))

从路由中获取到文件路径,然后组成文件是实际的绝对路径,使用send_from_directory函数将文件响应给浏览器,浏览器将会自动下载这个文件。send_from_directory函数也是flask的内置函数,使用from flask import send_from_directory来导入这个函数。send_from_directory函数接收文件路径和文件名,一定要带上as_attachment=True参数,告诉浏览器将文件下载到本地,而不打开文件。


这篇文章就先写到这里,下篇文章将文件上传和html模板,欢迎大家的关注!

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

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

相关文章

探索Perl的文件系统插件:灵活的系统扩展

探索Perl的文件系统插件&#xff1a;灵活的系统扩展 Perl是一种高度灵活和强大的脚本语言&#xff0c;它提供了丰富的API来处理文件和目录。文件系统插件机制是Perl中一个非常有用的功能&#xff0c;它允许开发者通过插件扩展文件系统的功能。本文将详细介绍如何在Perl中使用文…

谷粒商城实战-Vue学习过程中踩坑记录

一&#xff0c;自闭合的<script>标签 第一次使用Vue&#xff0c;按照步骤引入vue.js&#xff0c;创建div&#xff0c;创建Vue对象&#xff0c;但是未达预期效果。 插值表达式{{name}}没被替换为data对象中的属性值。 F12看了下网页源代码&#xff0c;发现创建Vue对象的…

OpenAI突发新模型GPT-4o mini,GPT-3.5退役!

OpenAI突发新模型&#xff0c;全面取代老去的GPT-3.5——GPT-4o mini&#xff01; 免费用户已可使用GPT-4o mini模型。 GPT-4o mini&#xff0c;能力接近原版GPT-4&#xff0c;价格却要便宜一个数量级&#xff1a; GPT-4o mini:每百万输入tokens&#xff0c;15美分&#xff0…

JVM工具实战:线上问题排查与性能分析

文章目录 jps&#xff1a;java 进程获取jstat&#xff1a;虚拟机统计信息监视工具jinfo&#xff1a;java 配置信息工具jmap&#xff1a;java 内存映像工具jstack&#xff1a;Java 堆栈跟踪工具 在程序运行过程中&#xff0c;我们可能会遇到各种问题&#xff0c;而稳定性风险是我…

RabbitMQ线程和连接模型详解

1. 线程、信道、连接、请求的概念 客户端&#xff08;生产者&#xff09;和服务端&#xff08;服务端&#xff09;之间建立连接。例如TCP连接&#xff0c;是一个长连接&#xff0c;也是较为稳定的连接&#xff0c;开销也较大。一般而言主客户端之间需要一个连接。但服务器需要…

【Node.js基础03】利用http模块创建Web服务

一&#xff1a;使用步骤 1 加载http模块&#xff0c;并创建Web服务程序 2 利用Web服务程序监听request事件&#xff0c;设置响应头和响应体 3 配置端口号并启动Web服务 4 浏览器请求设置的端口号&#xff0c;进行Web服务程序测试 二&#xff1a;简单应用 const http requir…

基于多线程延迟排序的睡眠排序算法的创新与改进

基于多线程延迟排序的睡眠排序算法的创新与改进 摘要 本文在传统睡眠排序算法的基础上&#xff0c;提出了一种改进方案&#xff0c;旨在优化处理负数和大规模数据集的性能。通过引入线程池管理和数据分段排序技术&#xff0c;改进后的算法在处理大数据集和包含负数的数据集时…

计算机网络入门 -- TCP详解

计算机网络入门 – TCP详解 1.TCP协议 1.1 报文格式 1.32位序号&#xff1a;该条TCP数据携带的起始序号。 2.32位确认序号&#xff1a;期望对方发送数据从那个序号开始发送。 3.4位首部长度&#xff1a;最大为0xF(15)&#xff0c;指的是TCP头部长度。 首部长度 4 位首部长…

谷粒商城实战笔记-37-前端基础-Vue-基本语法插件安装

文章目录 一&#xff0c;v-model1&#xff0c;双向绑定2&#xff0c;vue的双向绑定2.1 html元素上使用指令v-model2.2 model中声明对应属性2.3&#xff0c;验证view绑定modelmodel绑定view 完整代码 二&#xff0c;v-on1&#xff0c;指令简介2&#xff0c;在button按钮中添加v-…

rimraf快速删除node_modules方法

项目中&#xff0c;有时候会遇到下载依赖报错&#xff0c;然后想要删除node_modules再重新下载&#xff0c;但是有时候直接用yarn 或者npm install仍热不行&#xff0c;我们可以尽量用yran&#xff0c;因为npm 可能会自动下一些给一些包升级了&#xff0c;此时因为前面已经下过…

JVM:GraalVM

文章目录 一、介绍1、什么是GraalVM&#xff1a;2、GraalVM版本 二、两种使用模式 一、介绍 1、什么是GraalVM&#xff1a; GraalVM是Oracle官方推出的一款高性能JDK&#xff0c;使用它享受比OpenJDK或者OracleJDK更好的性能。GraalVM的官网地址&#xff1a;https://www.graa…

泛型新理解

1.创建三个类&#xff0c;并写好对应关系 package com.jmj.gulimall.study;public class People { }package com.jmj.gulimall.study;public class Student extends People{ }package com.jmj.gulimall.study;public class Teacher extends People{ }2.解释一下这三个方法 pub…

Xubuntu22.04 终端命令调用图形设置工具

最近将软件运行环境从Xubuntu16.04迁移到了Xubuntu22.04&#xff0c;主要是为了解决Qt程序的图形渲染使用集显去处理&#xff0c;而不是使用CPU。https://blog.csdn.net/qq_45445740/article/details/134495914 使用Xubuntu22.04系统发现很多图形设置工具不太容易在桌面找到&am…

数据结构(稀疏数组)

简介 稀疏数组是一种数据结构&#xff0c;用于有效地存储和处理那些大多数元素都是零或者重复值的数组。在稀疏数组中&#xff0c;只有非零或非重复的元素会被存储&#xff0c;从而节省内存空间。 案例引入 假如想把下面这张表存入文件&#xff0c;我们会怎么做&#xff1f;…

【LeetCode】翻转二叉树

目录 一、题目二、解法完整代码 一、题目 给你一棵二叉树的根节点 root &#xff0c;翻转这棵二叉树&#xff0c;并返回其根节点。 示例 1&#xff1a; 输入&#xff1a;root [4,2,7,1,3,6,9] 输出&#xff1a;[4,7,2,9,6,3,1] 示例 2&#xff1a; 输入&#xff1a;root…

数据结构 day1

2024.7.20 数据结构之旅 那么接下来&#xff0c;是笔者每日学习之后的总结&#xff0c;以此来巩固复习&#xff0c; 本次目标 入门 中等的数据结构学习&#xff0c;come on 前置知识点: C语言的 (指针、结构、库函数、内存管理等) 数据结构定义&#xff1a; 用于计算机存储、…

【系统架构设计 每日一问】一 在单表查询的情况下,ES快还是mysql快

在单表查询的情况下&#xff0c;Elasticsearch&#xff08;ES&#xff09;和MySQL的查询速度对比并非绝对&#xff0c;而是取决于多个因素&#xff0c;包括查询类型、数据量大小、索引策略、系统配置等。以下是对两者在单表查询速度方面的详细分析&#xff1a; 一、查询类型 E…

php-fpm如何配置max_children参数

前言 略 php-fpm 资源耗尽 php-fpm 的子进程耗尽的时&#xff1a; 会导致 502 出现nginx 出现错误日志 2024/07/18 20:19:10 [crit] 36390#0: *1402471 connect() to unix:/tmp/php-cgi-81.sock failed (2: No such file or directory) while connecting to upstream, cli…

Spring Authorization Server实战

Spring Authorization Server实战 Spring Authorizatin Server Spring Authorizatin Server是一个框架&#xff0c;它提供了OAuth2.1和OpenID Connect 1.0规范以及其它相关规范的实现&#xff0c;它是基于Spring Security构建的 OAuth2.0协议介绍 OAuth是一个开放标准的授权…

使用docker swarm搭建ruoyi集群环境

整体目标 项目背景 领导给到了我一个客户&#xff0c;客户商业模式为成本制作&#xff0c;成本核算。其中涉及到大量涉密数据&#xff0c;且与我们现有产品几乎没有兼容点&#xff08;我们是一套低代码的框架&#xff0c;客户有很多业务二开&#xff09; 测试环境给到了我6台…