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

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

一、图片分类管理

首先,我们需要在数据库中创建分类表,并在图片表中添加分类字段。
python 复制代码
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")

然后,我们添加创建和获取分类的接口。
python 复制代码
@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库进行图片压缩:
python 复制代码
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))  
    # ... 省略其他代码 ...

三、访问控制

为了简单起见,我们可以使用装饰器进行基本的访问控制。
python 复制代码
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():  
    # ... 实现管理员对图片的查看和删除功能 ...

四、文件上传验证

在上传接口中,我们可以添加文件验证逻辑。
python 复制代码
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加速等高级功能,通常需要使用专门的第三方服务和库来实现,这超出了简单示例的范围。

相关推荐
VidDown39 分钟前
24fps 转 25fps 不只是改个数字:帧率转换、PAL/NTSC 与音频补偿
python·网络协议·音视频·视频编解码·视频
死磕音视频2 小时前
让小模型做选择题:限定候选项并读取 logits 概率的入门实践(附 Python 代码)
开发语言·python·大模型·文本分类·transformers
凤山老林3 小时前
Spring Boot 接入国密 SM2/SM3/SM4 的一些实践记录
spring boot·后端·python
pride.li4 小时前
第03章 Python 教程-基础语法:注释与变量
服务器·前端·后端·python·算法·计算机视觉
databook5 小时前
用 Pydantic AI 从零搭建一个能干活的 AI Agent
人工智能·python
顽疲5 小时前
Java vue 养老系统源码详解:月账单 care_month_bill 与 Quartz 扣费 Job 实践
java·开发语言·vue.js·vue养老·springboot养老·java养老
康小旺5 小时前
把 markitdown 做成 Windows 桌面版:拖进文档就出 Markdown,附 233MB→64MB 打包裁剪全过程
python
Wang's Blog5 小时前
Java 项目实战: 交友项目 - 安装开发工具与环境准备
java·开发语言·交友
启观川6 小时前
数据结构与算法-第 3 章 常用算法-贪心算法
数据结构·笔记·python·算法·贪心算法
南笙北梦6 小时前
本地开源大模型多轮对话显存泄漏排查与修复实录
python