图床项目实战:后续开发与优化

news2024/11/20 2:22:00

        在之前的文章中,我们介绍了图床项目的基本实现,接下来,我将提供扩展功能和优化性能的关键代码片段。

 

一、图片分类管理

  • 首先,我们需要在数据库中创建分类表,并在图片表中添加分类字段。
class Category(db.Model):  
    id = db.Column(db.Integer, primary_key=True)  
    name = db.Column(db.String(50), nullable=False, unique=True)  
  
class Image(db.Model):  
    # ... 省略其他字段 ...  
    category_id = db.Column(db.Integer, db.ForeignKey('category.id'), nullable=False)  
    category = db.relationship("Category", back_populates="images")  
  
# 在Category模型中  
category.images = db.relationship("Image", order_by=Image.id, back_populates="category")

  • 然后,我们添加创建和获取分类的接口。
@app.route('/category', methods=['POST'])  
def create_category():  
    name = request.json.get('name')  
    if not name:  
        return jsonify({'error': 'Name is required'}), 400  
    category = Category(name=name)  
    db.session.add(category)  
    db.session.commit()  
    return jsonify({'id': category.id}), 201  
  
@app.route('/categories', methods=['GET'])  
def get_categories():  
    categories = Category.query.all()  
    return jsonify([{'id': category.id, 'name': category.name} for category in categories])

二、图片压缩

  • 使用Pillow库进行图片压缩:
from PIL import Image  
from io import BytesIO  
  
def compress_image(image_file):  
    image = Image.open(image_file)  
    output_io_stream = BytesIO()  
    image.save(output_io_stream, format='JPEG', quality=80)  
    output_io_stream.seek(0)  
    return output_io_stream  
  
# 在上传接口中使用  
@app.route('/upload', methods=['POST'])  
def upload_image():  
    # ... 省略其他代码 ...  
    file = request.files['file']  
    compressed_image = compress_image(file)  
    filename = file.filename  
    compressed_image.save(os.path.join(app.config['UPLOAD_FOLDER'], filename))  
    # ... 省略其他代码 ...

三、访问控制

  • 为了简单起见,我们可以使用装饰器进行基本的访问控制。
def login_required(func):  
    @wraps(func)  
    def wrapper(*args, **kwargs):  
        if 'user' not in session:  
            return redirect(url_for('login'))  
        return func(*args, **kwargs)  
    return wrapper  
  
@app.route('/admin/images', methods=['GET', 'DELETE'])  
@login_required  
def admin_images():  
    # ... 实现管理员对图片的查看和删除功能 ...

四、文件上传验证

  • 在上传接口中,我们可以添加文件验证逻辑。
ALLOWED_EXTENSIONS = {'png', 'jpg', 'jpeg', 'gif'}  
  
def allowed_file(filename):  
    return '.' in filename and filename.rsplit('.', 1)[1].lower() in ALLOWED_EXTENSIONS  
  
@app.route('/upload', methods=['POST'])  
def upload_image():  
    if 'file' not in request.files:  
        return jsonify({'error': 'No file part'}), 400  
    file = request.files['file']  
    if file.filename == '':  
        return jsonify({'error': 'No selected file'}), 400  
    if not allowed_file(file.filename):  
        return jsonify({'error': 'Invalid file type'}), 400  
    # ... 省略其他代码 ...

  • 请注意,上述代码只是示例性的,并未包含完整的错误处理和安全措施。在实际开发中,你需要确保对上传的文件进行更全面的验证,并对用户输入进行适当的清理和转义,以防止潜在的安全漏洞。

        此外,对于分布式存储和CDN加速等高级功能,通常需要使用专门的第三方服务和库来实现,这超出了简单示例的范围。

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

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

相关文章

STM32---DHT11采集与BH1750FVI光照传感器(HAL库、含源码)

写在前面:本节我们学习使用两个常见的传感器模块,分别为DHT11温湿度传感器以及BH1750FVI光照传感器,这两种传感器在对于环境监测中具有十分重要的作用,因为其使用简单方便,所以经常被用于STM32的项目之中。今天将使用分享给大家&a…

会员中心微服务

文章目录 1.环境配置1.创建会员中心模块2.检查父子模块的pom.xml1.父模块注意:如果父模块中的依赖显示not found,原因是子模块并没有引用,不用在意 2.子模块 3.pom.xml 引入相关依赖(别忘记刷新maven)4.application.ym…

【保姆级教程】YOLOv8目标检测:训练自己的数据集

一、YOLOV8环境准备 1.1 下载安装最新的YOLOv8代码 仓库地址: https://github.com/ultralytics/ultralytics1.2 配置环境 pip install -r requirements.txt -i https://pypi.tuna.tsinghua.edu.cn/simple二、数据准备 2.1 安装labelme标注软件 pip install label…

主干网络篇 | YOLOv8更换主干网络之GhostNet

前言:Hello大家好,我是小哥谈。GhostNet是2019年由华为诺亚方舟实验室发布的轻量级网络,速度和MobileNetV3相似,但是识别的准确率比MobileNetV3高,在ImageNet ILSVRC2012分类数据集的达到了75.7%的top-1精度。该论文提除了Ghost模块,通过廉价操作生成更多的特征图。基于一…

如何用pytorch调用预训练Swin Transformer中的一个Swin block模块

1,首先,我们需要知道的是,想要调用预训练的Swin Transformer模型,必须要安装pytorch2,因为pytorch1对应的torchvision中不包含Swin Transformer。 2,pytorch2调用预训练模型时,不建议使用pretr…

Uibot6.0 (RPA财务机器人师资培训第3天 )财务招聘信息抓取机器人案例实战

训练网站:泓江科技 (lessonplan.cn)https://laiye.lessonplan.cn/list/ec0f5080-e1de-11ee-a1d8-3f479df4d981https://laiye.lessonplan.cn/list/ec0f5080-e1de-11ee-a1d8-3f479df4d981https://laiye.lessonplan.cn/list/ec0f5080-e1de-11ee-a1d8-3f479df4d981(本博…

基于python+vue成都旅游网flask-django-php-nodejs

本篇论文对成都旅游网的需求分析、功能设计、系统设计进行了较为详尽的阐述,并对系统的整体设计进行了阐述,并对各功能的实现和主要功能进行了说明,并附上了相应的操作界面图。 语言:Python 框架:django/flask 软件版本…

阿里云幻兽帕鲁4核16G和8核32G服务器优惠价格

2024阿里云幻兽帕鲁专用服务器价格表:4核16G幻兽帕鲁专用服务器26元一个月、149元半年,默认10M公网带宽,8核32G幻兽帕鲁服务器10M带宽价格90元1个月、271元3个月。阿里云提供的Palworld服务器是ECS经济型e实例,CPU采用Intel Xeon …

3.22 ARM day7

实现三个按键的中断,现象和代码 include/key_inc.h: #ifndef __KEY_INC_H__ #define __KEY_INC_H__ #include "stm32mp1xx_gic.h" #include "stm32mp1xx_exti.h" #include "stm32mp1xx_rcc.h" #include "stm32mp1x…

部标JT808车辆定位监控平台单服务器13.6万接入压力测试记录(附源码)

之前经常有人问平台能支持多少设备同时在线,由于事情多没时间做。最近刚好有机会做下压力测试。在不间断的连续压测三天,最终结果为13.6万TCP连接,30秒上报频率。 一、测试目的 测试平台同时接入设备数量与并发处理能力。 二、准备环境 一…

阿里云幻兽帕鲁专用服务器创建教程,新手0基础

玩转幻兽帕鲁服务器,阿里云推出新手0基础一键部署幻兽帕鲁服务器教程,傻瓜式一键部署,3分钟即可成功创建一台Palworld专属服务器,成本仅需26元,阿里云服务器网aliyunfuwuqi.com分享2024年新版基于阿里云搭建幻兽帕鲁服…

算法---前缀和练习-1(除自身以外数组的乘积)

除自身以外数组的乘积 1. 题目解析2. 讲解算法原理3. 编写代码 1. 题目解析 题目地址:点这里 2. 讲解算法原理 首先,创建两个辅助数组 f 和 g,它们的长度与 nums 相同。数组 f 用于存储每个元素左侧所有元素的乘积,数组 g 用于存…

常见研发设计软件的许可管理

大型工程软件如Ansys、CAD、Fluent、Unigraph、ProE、HyperWorks、UG/NX,minitab等安装需要经过注册程序Flexlm才可以使用,而Flexlm中涉及到很多知识、技巧,也存在许多问题。本篇文章就是针对上述软件安装中的常见问题作一些探讨与解决。莱曼…

目标检测预测框可视化python代码实现--OpenCV

import numpy as np import cv2 import colorsys from PIL import Image, ImageDraw, ImageFontdef puttext_cn(img, text, pt, color(255,0,0), size16):if (isinstance(img, np.ndarray)): # 判断是否OpenCV图片类型img Image.fromarray(cv2.cvtColor(img, cv2.COLOR_BGR2…

Android Studio 无法下载 gradle-7.3.3-bin.zip

下载新的Android Studio,然后创建新的工程时,出现报错:Could not install Gradle distribution from https://services.gradle.org/distributions/gradle-7.3.3-bin.zip 或者超时,我们可以复制:https://services.grad…

11 Games101 - 笔记 - 几何(曲线与曲面)

11 几何(曲线与曲面) 贝塞尔曲线 定义 贝塞尔曲线:由控制点和线段组成的曲线,控制点是可拖动的支点。 如图,蓝色为贝塞尔曲线,p1, p2, p3为控制点,曲线和初始与终止端点相切,并且…

云计算 3月18号 (mysql安装及操作)

一、Mysql 1.1 MySQL数据库介绍 1.1.1 什么是数据库DB? DB的全称是database,即数据库的意思。数据库实际上就是一个文件集合,是一个存储数据的仓库,数据库是按照特定的格式把数据存储起来,用户可以对存储的数据进行…

Swift 结构化并发之全局 Actor 趣谈

概览 在 Swift 结构化并发构成的体系中,一个称为“演员”(Actor)的成员扮演了非常重要的角色,它被用来隔离和同步执行中的数据。 除了普通 Actor 以外,还有一个全局“演员”(Global Actor)的概念,它是做什么的?又有什么与众不同的长处呢? 在本篇博文中,您将学到如…

ruoyi-nbcio-plus基于vue3的flowable用户任务的升级修改

更多ruoyi-nbcio功能请看演示系统 gitee源代码地址 前后端代码: https://gitee.com/nbacheng/ruoyi-nbcio 演示地址:RuoYi-Nbcio后台管理系统 http://122.227.135.243:9666/ 更多nbcio-boot功能请看演示系统 gitee源代码地址 后端代码&#xff1a…