基于flask的web应用开发——搭建一个云盘

目录

  • 0. 前言
  • 1. 实现开放下载链接
  • 2. 稍加改装
  • 3. 效果演示
  • 4. 云服务器项目部署

0. 前言

本节利用 flask 开放下载链接

操作系统:Windows10 家庭版

开发环境:Pycahrm Comunity 2022.3

Python解释器版本:Python3.8

第三方库:flask humanize

1. 实现开放下载链接

我们需要在网站上放置一些资源供大家下载,那么我们应该根据输入的路由项的不同,而放置不同的下载链接。

我是这样处理的:

from flask import Flask,send_file

app = Flask(__name__)

@app.route('/download/<filename>')
def download_file(filename):
    # 实际应用中,这里可以进行文件名、文件类型验证等操作
    return send_file("downloads/{}".format(filename), as_attachment=True)


if __name__ == '__main__':
    # 0.0.0.0代表广播地址,同一局域网的用户都能访问
    # 端口号为5000,设置为专用端口(如80)需要管理员身份
    app.run(host = "0.0.0.0", port = 5000)

例如用户访问http://192.168.31.58:5000/download/嵌入式Linux应用程序开发.pdf时,将下载downloads目录下的嵌入式Linux应用程序开发.pdf文件:

访问以下网址:

http://192.168.31.58:5000/download/嵌入式Linux应用程序开发.pdf

或者用户输入

下载完成
在这里插入图片描述
看到上面你就已经学会了如何提供下载链接了,使用render_template() 方法重定向就好了。

2. 稍加改装

我现在在我的U盘存储了很多的软件安装包,这很有利于我更换系统或在其他人的电脑上快速构建开发环境。

现在我想通过将代码部署至服务器的方式,能让我不带U盘也能随时使用这些文件。

这样能达到一个百度网盘的效果,但是没有限速也不需要VIP

我先将软件安装包整理好,我的安装包文件都 放入项目目录下的downloads 了:
在这里插入图片描述
然后我需要使用html将其呈现出来,为了能够自动更新以及界面美观(不),我还使用了Jinja2和css:

这个是导航界面:
index.html

<!doctype html>
<html>
    <head>
        <title>Index</title>
        <style>
          body {
                  background-color: #f1f1f1;
                  font-family: Arial, sans-serif;
                }

                p {
                  margin: 0;
                  padding: 15px;
                  background-color: #fff;
                  box-shadow: 0 0 5px rgba(0, 0, 0, 0.2);
                }

                a {
                  color: #555;
                  text-decoration: none;
                  transition: color 0.2s ease-in-out;
                }

                a:hover {
                  color: #000;
                }

                h1 {
                  text-align: center;
                }

<!--                以下为居中显示布局-->
<!--                p {-->
<!--                  text-align: center;-->
<!--                }-->

        </style>
    </head>
    <body>
        <h1>IoT_H2的资源包</h1>
        <title>IoT_H2的资源包</title>
        {% for subdir in sub_dirs %}
        <p>
            <a href="{{ url_for('subdir', sub_dir=subdir) }}">
                {{ subdir }}
            </a>
        </p>
        {% endfor %}
    </body>
</html>

这个是放下载资源的界面:
subdir.html

<!DOCTYPE html>
<html>
  <head>
    <title>Files in {{ sub_dir }}</title>
    <style>
      body {
        font-family: Arial, sans-serif;
        background-color: #f0f0f0;
        margin: 0;
        padding: 0;
      }
      h1 {
        text-align: center;
        color: #333;
        margin-top: 30px;
      }
      p {
        margin: 0;
        padding: 10px;
        background-color: #fff;
        border: 1px solid #ddd;
        border-radius: 5px;
        box-shadow: 2px 2px 2px rgba(0, 0, 0, 0.1);
        transition: 0.3s;
      }
      p:hover {
        background-color: #f5f5f5;
        box-shadow: 3px 3px 3px rgba(0, 0, 0, 0.2);
      }
      a {
        color: #333;
        text-decoration: none;
        transition: 0.3s;
      }
      a:hover {
        color: #666;
        text-decoration: underline;
      }
    </style>
  </head>
  <body>
    <h1>{{ sub_dir }}</h1>
    <title>IoT_H2的资源包/{{ sub_dir }}</title>

    {% for file in files %}
      <p><a href="{{ url_for('download_file', filename=sub_dir + '/' + file[0]) }}">{{ file[0] + "-----------" + file[1] }}</a></p>
    {% endfor %}

  </body>
</html>

然后还有主程序:
main.py

from flask import Flask, render_template, abort, send_from_directory
import os
import humanize

app = Flask(__name__)


# 获取文件大小函数
def size(file_path):
    file_size = os.path.getsize(file_path)
    # 将文件大小转换为人类可读格式
    file_size_formatted = humanize.naturalsize(file_size)
    # 返回人类可读格式的文件大小
    return file_size_formatted.replace(" ","")

@app.route('/resource')
def index():
    # 需要展示的目录路径
    dir_path = 'downloads'

    # 检查目录路径是否存在
    if not os.path.exists(dir_path):
        abort(404)

    # 读取所有子目录
    sub_dirs = [d for d in os.listdir(dir_path) if os.path.isdir(os.path.join(dir_path, d))]

    return render_template('index.html', sub_dirs=sub_dirs,title = "IoT_H2的资源包")

@app.route('/resource/<sub_dir>')
def subdir(sub_dir):
    # 需要展示的目录路径
    dir_path = os.path.join('downloads', sub_dir)

    # 检查目录路径是否存在
    if not os.path.exists(dir_path):
        abort(404)

    # 读取目录下的所有文件
    files = [[f,size(dir_path + "/" + f)] for f in os.listdir(dir_path) if os.path.isfile(os.path.join(dir_path, f))]

    return render_template('subdir.html', sub_dir=sub_dir, files=files)

@app.route('/download/<path:filename>')
def download_file(filename):
    # 下载链接所对应的资源存放目录
    directory = 'downloads'
    # 返回下载文件,以附件形式下载
    return send_from_directory(directory, filename, as_attachment=True)



if __name__ == '__main__':
    app.run(host="0.0.0.0",port=80)

3. 效果演示

这是主界面,点击能够进入二级分类:
在这里插入图片描述

我点击编程类进入,下载了一个Anaconda解释器,651M,下载仅花了3秒钟,这里点名批评 某度网盘。
在这里插入图片描述

4. 云服务器项目部署

踩坑:腾讯云服务器SFTP有文件大小限制
在这里插入图片描述

虽然不喜欢搞samba,但还是搞了:
Linux下安装samba文件共享服务

但是这里我更推荐使用winscp,太好用了!
借鉴了这个:文件传输工具WinSCP下载安装教程
在这里插入图片描述
等待传输完成

安装 flask 和 humanize

pip install flask
pip install humanize

在这里插入图片描述
然后我的服务器就启动啦!
IoT_H2的资源包

去看看有没有什么需要的吧!
在这里插入图片描述

在这里插入图片描述

忘记了本机测试是局域网…甚至还是回环地址自己访问自己

部署在云服务器上慢的一批…

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

CSS基础学习--14 Position(定位)

一、定义 position属性指定了元素的定位类型 position 属性的五个值&#xff1a; staticrelativefixedabsolutesticky 元素可以使用的顶部&#xff0c;底部&#xff0c;左侧和右侧属性定位。然而&#xff0c;这些属性无法工作&#xff0c;除非是先设定position属性。他们也有…

leetcode90. 子集 II(java)

子集II leetcode90. 子集 II题目描述解题思路代码演示 回溯算法专题 leetcode90. 子集 II 来源&#xff1a;力扣&#xff08;LeetCode&#xff09; 链接&#xff1a;https://leetcode.cn/problems/subsets-ii 题目描述 给你一个整数数组 nums &#xff0c;其中可能包含重复元素…

服务器配置远程vscode

1 使用sftp同步远程代码 打开vscode&#xff0c;在扩展种搜索sftp&#xff0c;点击安装。   按住快捷键shiftctrlp&#xff0c;可以打开界面顶部的命令行&#xff0c;输入sftp&#xff0c;点击如下图的config选项&#xff1a;   会自动在.vscode目录下创建一个名为sftp.j…

Go语言实现单链表

博主最近在学习Go语言&#xff0c;所以打算更新一期Go语言版本的数据结构。这篇文章将的是Go语言如何实现单链表。 文章目录 前言一、个人见解&#xff0c;为什么学GO&#xff1f;二、Go语言实现单链表1.创建节点2.通过数组创建一个单链表3.遍历单链表4.单链表插入操作4.1 伪代…

基于AutoJs7实现的薅羊毛App专业版源码大分享

源码下载链接&#xff1a;https://pan.baidu.com/s/1QvalXeUBE3dADfpVwzF_xg?pwd0736 提取码&#xff1a;0736 专业版肯定比个人版功能强大并且要稳定。增加了很多功能的同时也测试封号的App&#xff0c;对于封号的App&#xff0c;给予剔除。虽然App数量减少了但是都是稳定的…

图书推荐|Python数据分析与挖掘实战(第2版)

Python数据分析与挖掘实战&#xff08;第2版&#xff09;一共分为三个部分&#xff0c;包括基础篇&#xff08;第1&#xff5e;5章&#xff09;、实战篇&#xff08;第6&#xff5e;12章&#xff09;、提高篇&#xff08;第13章&#xff09;。其中基础篇介绍了数据挖掘的基本原…

linux部署rabbitmq开启mqtt插件由于监听1883端口导致重启rabbitmq失败的解决方法

linux部署rabbitmq开启mqtt插件由于监听1883端口导致重启rabbitmq失败的解决方法 第一步&#xff1a;部署rabbitmq 部署rabbitmq请移步&#xff08;在这里可以找到erlang和rabbitmq适配的版本并下载安装包&#xff09;&#xff1a; https://blog.csdn.net/char1otte/article/de…

Flutter - 命令行工具源码调试环境搭建

文章目录 前言开发环境环境搭建运行测试调试测试最后 前言 开发Flutter项目时难免会遇到各种问题&#xff0c;源码调试对于问题的解决不可或缺。 对于Flutter框架项目的源码调试&#xff0c;如果是Flutter核心库调试&#xff0c;只需要创建一个Flutter项目并在项目中使用需要…

SpringCloud搭建Eureka服务注册中心(六)

前面说过eureka是c/s模式的 server服务端就是服务注册中心&#xff0c;其他的都是client客户端&#xff0c;服务端用来管理所有服务&#xff0c;客户端通过注册中心&#xff0c;来调用具体的服务&#xff1b; 我们先来搭建下服务端&#xff0c;也就是服务注册中心&#xff1b…

ansible-playbook

Ansible 的脚本 — playbook 剧本 playbooks 本身由以下各部分组成 &#xff08;1&#xff09;Tasks&#xff1a;任务&#xff0c;即通过 task 调用 ansible 的模板将多个操作组织在一个 playbook 中运行 &#xff08;2&#xff09;Variables&#xff1a;变量 &#xff08;3&a…

attention unet + cldice 论文总结

Blood Vessel Segmentation from Low-Contrast and Wide-Field Optical Microscopic Images of Cranial Window by Attention-Gate-Based Network论文总结 论文&#xff1a;Blood Vessel Segmentation by Attention-Gate-Based Network 目录 一、论文背景和出发点 二、创新点…

网络端口地址转换 NAPT 配置

你是某公司的网络管理员&#xff0c;公司办公网需要接入互联网&#xff0c;公司只向 ISP 申请了一条专线&#xff0c;该专线分配了一个公司 IP 地址&#xff0c;配置实现全公司的主机都能访问外网。 技术原理 NAT 将网络划分为内部网络和外部网络两部分&#xff0c;局域网主机…

基于spss的多元统计分析 之 实例3(血压、胆固醇于心脏病关系的研究)(8/8)

血压、胆固醇于心脏病关系的研究 摘要 一般线性模型中的一种&#xff0c;即反应变量 (dependent variables)为二分类变量的回归分析&#xff0c;模型输出为变量取特定值的概率。 在进行二元Logistic回归分析时&#xff0c;通常会涉及3个步骤&#xff0c;分别是数据处理、卡方分…

青翼科技自研模块化互联产品 • 模拟采集FMC子卡【产品资料】

FMC122是一款基于FMC标准规范&#xff0c;实现2路16-bit、1GSPS ADC同步采集&#xff0c;2路16-bit 2.5GSPS DAC同步回放功能子卡模块。该模块遵循VITA57.1标准&#xff0c;可直接与FPGA载卡配合使用&#xff0c;板卡ADC器件采用TI的ADS54J60芯片&#xff0c;该芯片具有两个模拟…

同一 tomcat 不同项目 session 共享实现

说明 这里仅讨论 同一个tomcat&#xff0c;部署了两个工程&#xff08;两个war包&#xff09;。不涉及不同tomcat,不涉及集群 背景 tomcat中的工程A包含用户登录、退出、权限控制等功能&#xff1b;工程B包含业务功能接口。工程A将用户登录信息加密响应给前端&#xff0c;前…

一个例子带你了解MapReduce

写在前面&#xff1a;博主是一只经过实战开发历练后投身培训事业的“小山猪”&#xff0c;昵称取自动画片《狮子王》中的“彭彭”&#xff0c;总是以乐观、积极的心态对待周边的事物。本人的技术路线从Java全栈工程师一路奔向大数据开发、数据挖掘领域&#xff0c;如今终有小成…

RT-DETR论文解读与代码

1.概述 目前以大名鼎鼎的YOLO为代表的基于CNN的实时监测网络需要NMS进行后处理&#xff0c;导致不能很好的优化网络&#xff0c;并且网络不够健壮&#xff0c;从而导致检测器的推理速度出现延迟。研究者也分析了Anchor-based和Anchor-free的YOLO的性能&#xff0c;发现Anchor并…

Java多线程与并发-原理

1、synchronized 线程安全问题的主要诱因 存在共享数据&#xff08;也称临界资源&#xff09;。存在多条线程共同操作这些共享数据。 解决问题的根本方法&#xff1a; 同一时刻有且只有一个线程在操作共享数据&#xff0c;其他线程必须等到该线程处理完数据后再对共享数据进…

Django之模板层

一、模板简介 在刚刚介绍完的视图层中我们提到&#xff0c;浏览器发送的请求信息会转发给视图进行处理&#xff0c;而视图在经过一系列处理后必须要有返回信息给浏览器。如果我们要返回html标签、css等数据给浏览器进行渲染&#xff0c;我们可以在视图中这么做 from django.s…

【Spring】核心与设计思想

哈喽&#xff0c;哈喽&#xff0c;大家好~ 我是你们的老朋友&#xff1a;保护小周ღ 谈起Java 圈子里的框架&#xff0c;最年长最耀眼的莫过于 Spring 框架啦&#xff0c;如今已成为最流行、最广泛使用的Java开发框架之一。不知道大家有没有在使用 Spring 框架的时候思考过这…