flask之文件管理网页(上传,下载,搜索,登录,注册) -- 翔山 第一版

news2025/1/24 22:31:37

前面说要做一个可以注册,登录,搜索,上传下载的网页,初版来了
第一版主代码

from flask import request, Flask, render_template, redirect, url_for, send_from_directory
import bcrypt
import os



savePath = os.path.join(os.getcwd(), "userInfo")

# 实例化
app = Flask(__name__)
# 这里是主页面,即第一步显示的网页,有一个对话框和搜索按钮
@app.route('/')
def mainweb():
    return render_template("first.html", result="欢迎使用NAS页面")

# 设定第二步的跳转网页,methods 设定请求类型,这里可以指定一种类型,就不用判断了。主要是类型不同,获取结果的方式不同
@app.route('/login', methods=['POST'])
def login():
    # post 类型抓取对话框内的内容
    username = request.form.get("username", "")
    passwd = request.form.get("password", "")
    if username == passwd == "":
        return render_template('login.html', result="欢迎")
    if verifyLogin(username, passwd):
        # return redirect(url_for('index'))
        return render_template('select.html')
    else:
        return render_template('login.html', result="用户名或密码错误")

@app.route('/signIn', methods=['POST'])
def signIn():
    # post 类型抓取对话框内的内容
    username = request.form.get("username", "")
    passwd = request.form.get("password", "")
    if username == passwd == "":
        return render_template('signIn.html', result="请输入正确的用户名和密码")
    if saveLogin(username, passwd):
        return render_template('login.html', result="注册成功,请登录")
    else:
        return render_template('signIn.html', result="用户名重复,请更换用户名重新注册")
      
def verifyLogin(user, passwd):
    # 读取存储的用户信息
    saveFile = os.path.join(savePath, user)
    if os.path.isfile(saveFile):
        with open(saveFile, 'r', encoding="UTF-8") as f:
            savepasswd = f.read()
            # 从合并的字符串中提取存储的salt
            salt = savepasswd.split('||')[0].encode('utf-8')
            # 使用存储的salt哈希输入密码
            hash_passwd = bcrypt.hashpw(passwd.encode('utf-8'), salt)
            password = f"{salt.decode('utf-8')}||{hash_passwd.decode('utf-8')}"
            return password == savepasswd
    else:
        return False

def saveLogin(user, passwd):
    # 生成一个新的salt
    salt = bcrypt.gensalt()
    # 使用生成的salt哈希密码
    hashed_password = bcrypt.hashpw(passwd.encode('utf-8'), salt)
    # 将salt和哈希密码合并以便存储
    stored_password = f"{salt.decode('utf-8')}||{hashed_password.decode('utf-8')}"
    # 保存用户信息
    saveFile = os.path.join(savePath, user)
    if os.path.isfile(saveFile):
        return False
    else:
        if os.path.isdir(savePath):
            pass
        else:
            os.makedirs(savePath)
        with open(saveFile, 'w', encoding="UTF-8") as f:
            f.write(stored_password)
        return True

# 上传文件存储路径
UPLOAD_FOLDER = 'uploads'
app.config['UPLOAD_FOLDER'] = UPLOAD_FOLDER
# 确保上传文件夹存在
if not os.path.exists(app.config['UPLOAD_FOLDER']):
    os.makedirs(app.config['UPLOAD_FOLDER'])

@app.route('/select', methods=['POST'])
def select():
    return render_template('select.html')

@app.route('/index', methods=['GET', 'POST'])
def index():
    # 获取上传文件夹中的文件列表
    files = os.listdir(app.config['UPLOAD_FOLDER'])
    return render_template('download.html', files=files)

@app.route('/upload', methods=['GET', 'POST'])
def upload_file():
    if 'file' not in request.files:
        return render_template('upload.html', result="进入上传页面")
	# 判断下是否有输入文件
    file = request.files['file']
    if file.filename == '':
        return render_template('upload.html', result="没有选择文件")

    # 保存文件到指定路径
    file.save(os.path.join(app.config['UPLOAD_FOLDER'], file.filename))
    # 更新网页,显示 index 页面
    return redirect(url_for('index'))

@app.route('/download/<filename>')
def download_file(filename):
    # 从上传文件夹中发送文件(下载)
    return send_from_directory(os.path.join(os.getcwd(), app.config['UPLOAD_FOLDER']), filename, as_attachment=True)

@app.route('/find', methods=['post'])
def find():
    # post 类型抓取对话框内的内容
    find_key = request.form.get("q", "")
    print(find_key)
    if find_key == "":
        return render_template('find.html', result="请输入关键字进行搜索")
    else:
        # 调用find_result函数,开始遍历文件夹搜索文件
        find_result = find_file(find_key)
        if find_result == "没有搜索到文件":
            return render_template('find.html', result=find_result)
        else:
            # 跳转网页,输出结果
            return render_template('download.html', files=find_result)

def find_file(find_key):
    findfiles = []
    # 遍历文件夹及子文件夹和文件等
    for root, dirs, files in os.walk(os.path.join(os.getcwd(), app.config['UPLOAD_FOLDER']), topdown=False):
        for filename in files:
            # 将文件路径和文件名结合,生成路径
            # allfiles.append(os.path.join(root, filename))
            # 判断这个路径是否含关键字
            if find_key in filename:
                findfiles.append(os.path.basename(filename))
    # 假设没搜到,返回 no found,搜到了,则将搜索到的结果组合成字符串返回
    if len(findfiles) == 0:
        myresult = "没有搜索到文件"
    else:
        myresult = findfiles
    return myresult


if __name__ == '__main__':
	# 以debug模式运行,只有当前电脑能访问此网页,其他电脑不行
    app.run(debug=True)

需要用到的html文件如下:
signIn.html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Sign In Page</title>
    <style>
        body {
            font-family: Arial, sans-serif;
            background-color: #f4f4f4;
            margin: 0;
            padding: 0;
            display: flex;
            align-items: center;
            justify-content: center;
            height: 100vh;
        }

        .signin-container {
            background-color: #fff;
            padding: 20px;
            border-radius: 8px;
            box-shadow: 0 0 10px rgba(0, 0, 0, 0.1);
        }

        .form-group {
            margin-bottom: 15px;
        }

        .form-group label {
            display: block;
            margin-bottom: 8px;
            font-weight: bold;
        }

        .form-group input {
            width: 100%;
            padding: 8px;
            box-sizing: border-box;
            border: 1px solid #ccc;
            border-radius: 4px;
        }

        .form-group button {
            padding: 10px;
            background-color: #007bff;
            color: #fff;
            border: none;
            border-radius: 4px;
            cursor: pointer;
        }
        /* 设置动图的样式和位置 */  
        .animated-image {  
            /* 宽度和高度可以根据需要调整 */  
            width: 200px;  
            height: 200px;  
            /* 位置属性可以控制动图的位置 */  
            position: absolute; /* 或者使用其他位置属性,如 relative、fixed 等 */  
            top: 50px; /* 调整 top、right、bottom 和 left 属性来定位动图 */  
            left: 100px;  
        }  
    </style>
</head>
<body>
    <!-- 使用 img 标签嵌入动图 -->
    <img src="{{ url_for('static', filename='huaji.gif') }}" alt="欢迎" class="animated-image">

    <div class="signin-container">
        <h1>{{ result }}<h1>
        <h2>注册</h2>
        <form action="/signIn" method="post">
            <div class="form-group">
                <label for="username">用户:</label>
                <input type="text" id="username" name="username" required>
            </div>
            <div class="form-group">
                <label for="password">密码:</label>
                <input type="password" id="password" name="password" required>
            </div>
            <div class="form-group">
                <button type="submit">注册</button>
            </div>
        </form>
    </div>

</body>
</html>

login.html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Login Page</title>
    <style>
        body {
            font-family: Arial, sans-serif;
            background-color: #f4f4f4;
            margin: 0;
            padding: 0;
            display: flex;
            align-items: center;
            justify-content: center;
            height: 100vh;
        }

        .login-container {
            background-color: #fff;
            padding: 20px;
            border-radius: 8px;
            box-shadow: 0 0 10px rgba(0, 0, 0, 0.1);
        }

        .form-group {
            margin-bottom: 15px;
        }

        .form-group label {
            display: block;
            margin-bottom: 8px;
            font-weight: bold;
        }

        .form-group input {
            width: 100%;
            padding: 8px;
            box-sizing: border-box;
            border: 1px solid #ccc;
            border-radius: 4px;
        }

        .form-group button {
            padding: 10px;
            background-color: #007bff;
            color: #fff;
            border: none;
            border-radius: 4px;
            cursor: pointer;
        }
        /* 设置动图的样式和位置 */  
        .animated-image {  
            /* 宽度和高度可以根据需要调整 */  
            width: 200px;  
            height: 200px;  
            /* 位置属性可以控制动图的位置 */  
            position: absolute; /* 或者使用其他位置属性,如 relative、fixed 等 */  
            top: 50px; /* 调整 top、right、bottom 和 left 属性来定位动图 */  
            left: 100px;  
        }  
    </style>
</head>
<body>
    <!-- 使用 img 标签嵌入动图 -->
    <img src="{{ url_for('static', filename='huaji.gif') }}" alt="欢迎" class="animated-image">

    <div class="login-container">
        <h1>{{ result }}<h1>
        <h2>登录</h2>
        <form action="/login" method="post">
            <div class="form-group">
                <label for="username">用户:</label>
                <input type="text" id="username" name="username" required>
            </div>
            <div class="form-group">
                <label for="password">密码:</label>
                <input type="password" id="password" name="password" required>
            </div>
            <div class="form-group">
                <button type="submit">登录</button>
            </div>
        <form>
    </div>

</body>
</html>

select.html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Select</title>
    <style>
        body {
            font-family: Arial, sans-serif;
            background-color: #f4f4f4;
            margin: 0;
            padding: 0;
            display: flex;
            align-items: center;
            justify-content: center;
            height: 100vh;
        }

        .signin-container {
            background-color: #fff;
            padding: 20px;
            border-radius: 8px;
            box-shadow: 0 0 10px rgba(0, 0, 0, 0.1);
        }

        .form-group {
            margin-bottom: 15px;
        }

        .form-group label {
            display: block;
            margin-bottom: 8px;
            font-weight: bold;
        }

        .form-group input {
            width: 100%;
            padding: 8px;
            box-sizing: border-box;
            border: 1px solid #ccc;
            border-radius: 4px;
        }

        .form-group button {
            padding: 10px;
            background-color: #007bff;
            color: #fff;
            border: none;
            border-radius: 4px;
            cursor: pointer;
        }
        /* 设置动图的样式和位置 */  
        .animated-image {  
            /* 宽度和高度可以根据需要调整 */  
            width: 200px;  
            height: 200px;  
            /* 位置属性可以控制动图的位置 */  
            position: absolute; /* 或者使用其他位置属性,如 relative、fixed 等 */  
            top: 50px; /* 调整 top、right、bottom 和 left 属性来定位动图 */  
            left: 100px;  
        }  
    </style>
</head>
<body>
    <!-- 使用 img 标签嵌入动图 -->
    <img src="{{ url_for('static', filename='huaji.gif') }}" alt="欢迎" class="animated-image">

    <div class="signin-container">
        <h2>--进入上传页面--</h2>
        <form action="/upload" method="post">
            <div class="form-group">
                <button type="submit">进入上传页面</button>
            </div>
        </form>
        <h2>--进入搜索页面--</h2>
        <form action="/find" method="post">
            <div class="form-group">
                <button type="submit">进入搜索页面</button>
            </div>
        </form>
        <h2>--进入所有文件下载页面--</h2>
        <form action="/index" method="post">
            <div class="form-group">
                <button type="submit">进入下载页面</button>
            </div>
        </form>
    </div>

</body>
</html>

find.html

<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>search</title>
</head>
<body>
    <h2>{{ result }}</h2>
    <form action="/find" method="post">
        <input type="text" name="q" />
        <input type="submit" value="搜索" />
    </form>
</body>
</html>

upload.html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>File Upload and Download</title>
</head>
<body>

    <h2>{{ result }}</h2>
    
    <!-- 上传表单 -->
    <form action="/upload" method="post" enctype="multipart/form-data">
        <input type="file" name="file" id="fileInput" accept=".txt, .pdf, .csv, .log">
        <button type="submit">上传</button>
    </form>

    <!-- 返回主页面-->
    <form action="/select" method="post">
        <button type="submit">返回主页面</button>
    </form>
</body>
</html>

download.html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>File Upload and Download Example</title>
</head>
<body>
    <h2>-- 进入上传页面--</h2>
    <form action="/upload" method="post">
        <button type="submit">上传</button>
    </form>
    <!-- 下载文件列表 -->
    <h2>可下载文件列表<h2>
    <ul>
        {% for file in files %}
            <li>
                <a href="{{ url_for('download_file', filename=file) }}" download="{{ file }}">{{ file }}</a>
            </li>
        {% endfor %}
    </ul>

</body>
</html>

first.html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Login Page</title>
    <style>
        body {
            font-family: Arial, sans-serif;
            background-color: #f4f4f4;
            margin: 0;
            padding: 0;
            display: flex;
            align-items: center;
            justify-content: center;
            height: 100vh;
        }

        .login-container {
            background-color: #fff;
            padding: 20px;
            border-radius: 8px;
            box-shadow: 0 0 10px rgba(0, 0, 0, 0.1);
        }

        .form-group {
            margin-bottom: 15px;
        }

        .form-group label {
            display: block;
            margin-bottom: 8px;
            font-weight: bold;
        }

        .form-group input {
            width: 100%;
            padding: 8px;
            box-sizing: border-box;
            border: 1px solid #ccc;
            border-radius: 4px;
        }

        .form-group button {
            padding: 10px;
            background-color: #007bff;
            color: #fff;
            border: none;
            border-radius: 4px;
            cursor: pointer;
        }
        /* 设置动图的样式和位置 */  
        .animated-image {  
            /* 宽度和高度可以根据需要调整 */  
            width: 200px;  
            height: 200px;  
            /* 位置属性可以控制动图的位置 */  
            position: absolute; /* 或者使用其他位置属性,如 relative、fixed 等 */  
            top: 50px; /* 调整 top、right、bottom 和 left 属性来定位动图 */  
            left: 100px;  
        }  
    </style>
</head>
<body>
    <!-- 使用 img 标签嵌入动图 -->
    <img src="{{ url_for('static', filename='huaji.gif') }}" alt="欢迎" class="animated-image">

    <div class="login-container">
        <h1>{{ result }}<h1>
        <form action="/login" method="post">
            <div class="form-group">
                <button type="submit">进入登录页面</button>
            </div>
        </form>
        <form action="/signIn" method="post">
            <div class="form-group">
                <button type="submit">进入注册页面</button>
            </div>
        </form>
    </div>

</body>
</html>

一共七个html模版,太不容易了
全都放到 templates文件夹中
文件结构:
在这里插入图片描述
运行起来后,浏览器输入网站进入页面:
1.首页:
在这里插入图片描述
2.注册界面:
这个界面暂时没有设定密码格式等等检测
现在只检测,用户名重复是无法注册的,会有信息提示
用户名重复,请更换用户名重新注册
注册成功会直接跳转到登录界面
暂时也没放返回按钮,只能网页回退或者改IP地址退
在这里插入图片描述
3.登录界面:
会检查用户名和密码是否匹配,找不到用户名或者密码错误都直接提示用户名或密码错误
在这里插入图片描述
4.登录成功后的首页:
选择将要做的动作,上传,搜索,下载界面(下载界面默认显示指定文件夹下的所有文件)
在这里插入图片描述
5.上传界面:
空文件提示没有选择文件
选择文件上传后会显示当前目录下所有文件
返回主页面就是返回页面 4
在这里插入图片描述
6.进入下载页面:

上传成功后也会跳转到这个页面,点击上传可以返回上传页面
这里默认显示指定文件夹下所有的文件
在这里插入图片描述
7.搜索页面:
为了方便看,我多放了些文件到存储的文件夹内,看看效果:
文件夹内的文件:
在这里插入图片描述
搜索页面:
在这里插入图片描述
如果没有输入关键字或者输入关键字后没查到,那么这个页面会提示,且可以重新输入
暂时没放返回按钮
假如搜到了,会跳转到下载页面:
在这里插入图片描述
下载的话,直接点击即可:
在这里插入图片描述

以上就是全部内容,基本功能用翔山堆出来了,后续会慢慢慢慢精简优化,不过…就说他能不能用吧…嘿嘿
搜索列表打印功能后续添加…

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

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

相关文章

17个常用经典数据可视化图表与冷门图表

数据可视化是创建信息图形表示的过程。随着可视化技术的飞速发展&#xff0c;可以利用强大的可视化工具选择合适的数据可视化图表来展示数据。以下专业人士都应该知道的一些最重要的数据可视化图表。 常见数据可视化图表 饼图 饼图是最常见和最基本的数据可视化图表之一。饼图…

VM进行TCP/IP通信

OK就变成这样 vm充当服务端的话也是差不多的操作 点击连接 这里我把端口号换掉了因为可能被占用报错了&#xff0c;如果有报错可以尝试尝试换个端口号 注&#xff1a; 还有一个点在工作中要是充当服务器&#xff0c;要去网络这边看下他的ip地址 拉到最后面

DRF从入门到精通三(反序列化数据校验源码分析、断言Assert、DRF之请求、响应)

文章目录 一、反序列化数据校验源码分析二、断言Assert三、DRF之请求、响应Request类和Response类请求中的Request 能够解析前端传入的编码格式响应中的Response能够响应的编码格式 一、反序列化数据校验源码分析 反序列化数据校验&#xff0c;校验顺序为&#xff1a;先校验字段…

动物分类识别教程+分类释义+界面展示

1.项目简介 动物分类教程分类释义界面展示 动物分类是生物学中的一个基础知识&#xff0c;它是对动物进行分类、命名和描述的科学方法。本教程将向您介绍动物分类的基本原则和方法&#xff0c;并提供一些常见的动物分类释义。 动物分类的基本原则 动物分类根据动物的形态、…

redis主从复制(在虚拟机centos的docker下)

1.安装docker Docker安装(CentOS)简单使用-CSDN博客 2.编辑3个redis配置 cd /etc mkdir redis-ms cd redis-ms/ vim redis6379.conf vim redis6380.conf vim redis6381.conf# master #端口号 port 6379#设置客户端连接后进行任何其他指定前需要使用的密码 requirepass 12345…

【SpringBoot篇】解决缓存击穿问题① — 基于互斥锁方式

文章目录 &#x1f339;什么是缓存击穿&#x1f33a;基于互斥锁解决问题&#x1f6f8;思路 &#x1f3f3;️‍&#x1f308;代码实现 &#x1f339;什么是缓存击穿 缓存击穿是指在使用缓存系统时&#xff0c;对一个热点数据的高并发请求导致缓存失效&#xff0c;多个请求同时访…

ESP8266网络相框采用TFT_eSPI库TJpg_Decoder库mixly库UDP库实现图片传送

使用ESP8266和TFT_ESPI模块来显示图片数据。具体来说&#xff0c;我们将使用ILI9431显示器作为显示设备&#xff0c;并通过UDP协议将图片数据从发送端传输到ESP8266。最后&#xff0c;我们将解析这些数据并在TFT屏幕上显示出来。在这个过程中&#xff0c;我们将面临一些编程挑战…

The Cherno C++笔记 03

目录 Part 07 How the C Linker Works 1.链接 2.编译链接过程中出现的错误 2.1 缺少入口函数 注意:如何区分编译错误还是链接错误 注意&#xff1a;入口点可以自己设置 2.2 找不到自定义函数 2.2.1缺少声明 2.2.2自定义函数与引用函数不一致 2.3 在头文件中放入定义 …

conda环境下更改虚拟环境安装路径

1 引言 在Anaconda中如果没有指定路径,虚拟环境会默认安装在anaconda所安装的目录下,但如果默认环境的磁盘空间不足&#xff0c;无法满足大量安装虚拟环境的需求&#xff0c;此时我们需要更改虚拟环境的安装路径&#xff0c;有以下两种方案&#xff1a; 方案1&#xff1a; 每次…

【贪心算法】之 摆动序列(中等题)

实际操作上&#xff0c;其实连删除的操作都不用做&#xff0c;因为题目要求的是最长摆动子序列的长度&#xff0c;所以只需要统计数组的峰值数量就可以了&#xff08;相当于是删除单一坡度上的节点&#xff0c;然后统计长度&#xff09; 这就是贪心所贪的地方&#xff0c;让峰…

Java设计模式之单例模式以及如何防止通过反射破坏单例模式

单例模式 单例模式使用场景 ​ 什么是单例模式&#xff1f;保障一个类只能有一个对象&#xff08;实例&#xff09;的代码开发模式就叫单例模式 ​ 什么时候使用&#xff1f; 工具类&#xff01;&#xff08;一种做法&#xff0c;所有的方法都是static&#xff0c;还有一种单…

Python命令行参数解析:原理、技巧与实践

文章目录 引言命令行参数解析原理命令行参数概述使用argparse模块解析命令行参数1. 创建ArgumentParser对象2. 添加命令行参数3. 解析命令行参数4. 可选参数action5. 参数的类型转换 实践示例总结结束语 引言 在Python中&#xff0c;命令行参数解析是一个重要的主题&#xff0…

【稳定检索|投稿优惠】2024年绿色能源与电网电力系统国际会议(ICGEGPS 2024)

2024年绿色能源与电网电力系统国际会议(ICGEGPS 2024) 2024 International Conference on Green Energy and Grid Power Systems(ICGEGPS) 一、【会议简介】 2024年绿色能源与电网电力系统国际会议(ICGEGPS 2024)将在宜宾盛大召开。本次会议将聚焦绿色能源与电网电力系统的最新…

Linux——缓冲区

我在上篇博客留下了一个问题&#xff0c;那个问题就是关于缓冲区的问题&#xff0c;我们发现 文件有缓冲区&#xff0c;语言有用户级缓冲区&#xff0c;那么缓冲区到底是什么&#xff1f;&#xff0c;或者该怎 么认识缓冲区&#xff1f;这篇文章或许会让你有所认识&#xff0c;…

单例模式的基本用法

单例模式是众多设计模式中的一种&#xff0c;那说到设计模式&#xff0c;我们要想知道什么是设计模式? 设计模式就是一套反复使用、多数人知晓的、经过分类、代码设计经验总结。 使用设计模式是为了可重用代码、让代码更容易被他人理解&#xff0c;保证代码的可靠性。毫无疑问…

Oracle WebLogic Server WebLogic WLS组件远程命令执行漏洞 CVE-2017-10271

Oracle WebLogic Server WebLogic WLS组件远程命令执行漏洞 CVE-2017-10271 已亲自复现 漏洞名称漏洞描述影响版本 漏洞复现环境搭建漏洞利用 修复建议 漏洞名称 漏洞描述 在Oracle WebLogic Server 10.3.6.0.0/12.1.3.0.3/2.2.1/1.10/12.2.1.1/22.0&#xff08;Application …

Pipelined-ADC设计二——结构指标及非理想因素(Part1)

本章将详细介绍电路各个模块的设计思路和设计中需要注意的关键点&#xff0c;给出流水线ADC中的非理想因素&#xff0c;并计算出流水线ADC各个模块具体指标。根据电路中信号的传输方向&#xff0c;依次介绍采样保持电路、Sub_ADC&#xff0c;MDAC 等模块的设计。&#xff08;本…

【GitHub精选项目】短信系统测试工具:SMSBoom 操作指南

前言 本文为大家带来的是 OpenEthan 开发的 SMSBoom 项目 —— 一种用于短信服务测试的工具。这个工具能够发送大量短信&#xff0c;通常用于测试短信服务的稳定性和处理能力。在合法和道德的范畴内&#xff0c;SMSBoom 可以作为一种有效的测试工具&#xff0c;帮助开发者和系统…

关于redis单线程和IO多路复用的理解

首先&#xff0c;Redis是一个高性能的分布式缓存中间件。其复杂性不言而喻&#xff0c;对于Redis整体而言肯定不是只有一个线程。 我们常说的Redis 是单线程&#xff0c;主要是指 Redis 在网络 IO和键值对读写是采用一个线程来完成的&#xff0c;这也是 Redis 对外提供键值存储…

【ARMv8M Cortex-M33 系列 1 -- SAU 介绍】

文章目录 Cortex-M33 SAU 介绍SAU 的主要功能包括SAU 寄存器配置示例 Cortex-M33 SAU 介绍 在 ARMv8-M 架构中&#xff0c;SAU&#xff08;Security Attribution Unit&#xff09;是安全属性单元&#xff0c;用于配置和管理内存区域的安全属性。SAU 是 ARM TrustZone 技术的一…