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

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

 

一、图片分类管理

  • 首先,我们需要在数据库中创建分类表,并在图片表中添加分类字段。
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.hqwc.cn/news/562698.html

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

相关文章

HTML5和CSS3笔记

一:网页结构(html): 1.1:页面结构: 1.2:标签类型: 1.2.1:块标签: 1.2.2:行内标签: 1.2.3:行内块标签: 1.2.4:块标签与行…

微信小程序 - picker-viewer实现省市选择器

简介 本文会基于微信小程序picker viewer组件实现省市选择器的功能。 实现效果 实现代码 布局 <picker-view value"{{value}}" bindchange"bindChange" indicator-style"height: 50px;" style"width: 100%; height: 300px;" &…

鸿蒙Harmony应用开发—ArkTS-LazyForEach:数据懒加载

LazyForEach从提供的数据源中按需迭代数据&#xff0c;并在每次迭代过程中创建相应的组件。当在滚动容器中使用了LazyForEach&#xff0c;框架会根据滚动容器可视区域按需创建组件&#xff0c;当组件滑出可视区域外时&#xff0c;框架会进行组件销毁回收以降低内存占用。 接口…

Excel数字乱码怎么回事 Excel数字乱码怎么调回来

在日常工作中&#xff0c;Excel是我们最常使用的数据处理软件之一&#xff0c;它强大的功能使得数据处理变得既简单又高效。然而&#xff0c;用户在使用Excel时偶尔会遇到数字显示为乱码的问题&#xff0c;这不仅影响了数据的阅读&#xff0c;也大大降低了工作效率。那么&#…

架构整洁之道-读书总结

1 概述 1.1 关于本书 《架构整洁之道》&#xff08;Clean Architecture: A Craftsman’s Guide to Software Structure and Design&#xff09;是由著名的软件工程师Robert C. Martin&#xff08;又称为Uncle Bob&#xff09;所著。这本书提供了软件开发和架构设计的指导原则…

Linux :环境基础开发工具

目录: 1. Linux 软件包管理器 yum 1. 什么是软件包 2. 查看软件包 3. 如何安装软件 4. 如何卸载软件 2. Linux开发工具 1. Linux编辑器-vim的基本概念 2. vim使用 3. vim的基本操作 4. vim正常模式命令集 5. vim末行模式命令集 6. 简单vim配置 3. Linux编译器-gcc/…

【WEEK4】 【DAY4】AJAX第一部分【中文版】

【WEEK4】 【DAY4】AJAX第一部分【中文版】 2024.3.21 Thursday 目录 8.AJAX8.1.简介8.2.伪造ajax8.2.1.新建module&#xff1a;springmvc-06-ajax8.2.2.添加web支持&#xff0c;导入pom依赖8.2.2.1.修改web.xml8.2.2.2.新建jsp文件夹 8.2.3.新建applicationContext.xml8.2.4.…

阿里云效流水线—发布公用jar到Maven私仓

后端项目发布 1.选择流水线 2.新建流水线 3.选择模板 4.选择代码仓库 5.调整构建命令 添加mvn install 重新构建项目 6.添加镜像 在wms-app目录下新建Dockerfile文件(Dockerfile文件名中的D一定要是大写的&#xff09;文件&#xff0c;重新推送项目 #基础镜像 FROM openjd…

Python界面库Flet(1)介绍和快速使用

Python界面库Flet(1)快速上手使用 Author&#xff1a;Once Day Date&#xff1a;2024年3月19日 一位热衷于Linux学习和开发的菜鸟&#xff0c;试图谱写一场冒险之旅&#xff0c;也许终点只是一场白日梦… 漫漫长路&#xff0c;有人对你微笑过嘛… 全系列文章可参考专栏: Pyt…

记录‘No module named ‘notebook.notebookapp‘’导致jupyter打不开的解决方法

最初是因为无法重命名文件的问题&#xff0c;更新了notebook&#xff0c;但是更新之后打不开了 在终端输入 jupyter notebook 报错 File "/Users/maclin/Library/Python/3.8/bin/jupyter-notebook", line 5, in <module> from notebook.notebookapp import ma…

19、【qlib】【其他组件/特性/主题】任务管理

简介 工作流部分介绍了如何松耦合地运行研究流程,但使用qrun时只能执行单个任务。为了自动地生成和执行不同的任务,任务管理模块提供了一整套流程,包括任务生成、任务存储、任务训练及任务收集。借助这个模块,用户可以在不同时间段、不同损失函数或甚至不同模型下自动运行…

SQL96 返回顾客名称和相关订单号(表的普通联结、内联结inner join..on..)

方法一&#xff1a;普通联结 select cust_name, order_num from Customers C,Orders O where C.cust_id O.cust_id order by cust_name,order_num;方法二&#xff1a;使用内连接 select cust_name,order_num from Customers C inner join Orders O on C.cust_id O.cust_id …