Flask 中使用 Celery 上传、调整大小并将图片存储到 Amazon S3

Flask 中使用 Celery 上传、调整大小并将图片存储到 Amazon S3

在本文中,我们将介绍如何在 Flask 中使用 Celery 完成图片上传、调整大小并将其存储到 Amazon S3 的任务。

阅读更多:Flask 教程

1. 概述

当用户上传图片时,通常需要将其调整为适当的尺寸,并将其存储到云存储服务中。使用 Celery,我们可以将这些耗时的任务异步处理,以提高网站的响应速度。

2. 准备工作

在开始之前,我们需要做以下准备工作:
– 安装 Flask 和 Celery 模块
– 配置 Amazon S3 存储桶
– 设置 Flask 应用的配置文件

首先,我们使用以下命令安装 Flask 和 Celery 模块:

$ pip install flask celery

接下来,我们需要配置 Amazon S3 存储桶。在 Amazon S3 控制台创建一个存储桶,并获得访问密钥和秘密密钥。将这些凭据保存在项目的配置文件中。

然后,我们需要设置 Flask 应用的配置文件。在配置文件中,我们需要指定 Celery 的中间人和结果后端。另外,还需要配置 Amazon S3 的凭据和存储桶名称。

配置文件示例:

# config.py
CELERY_BROKER_URL = 'redis://localhost:6379/0'
CELERY_RESULT_BACKEND = 'redis://localhost:6379/0'
AWS_ACCESS_KEY_ID = 'YOUR_AWS_ACCESS_KEY_ID'
AWS_SECRET_ACCESS_KEY = 'YOUR_AWS_SECRET_ACCESS_KEY'
AWS_S3_BUCKET_NAME = 'YOUR_S3_BUCKET_NAME'

3. 编写任务函数

在 Flask 中,我们可以通过定义 Celery 任务函数来处理上传和调整大小的任务。任务函数应该接收用户上传的图片文件,并将其调整为指定的尺寸。

# tasks.py
import os
from PIL import Image
from flask import current_app
from celery import Celery

app = current_app._get_current_object()
celery = Celery(app.import_name, broker=app.config['CELERY_BROKER_URL'])
celery.conf.update(app.config)


@celery.task
def process_image(image_path, width, height):
    image = Image.open(image_path)
    resized_image = image.resize((width, height))
    resized_path = f"resized_{os.path.basename(image_path)}"
    resized_image.save(resized_path)
    upload_to_s3(resized_path)


def upload_to_s3(file_path):
    # Code to upload the file to Amazon S3
    # ...

在上述代码中,我们首先导入了必要的模块。然后,我们创建了一个 Celery 实例,并使用 Flask 应用的配置信息进行配置。接下来,我们定义了一个任务函数 process_image,它接收图片路径、宽度和高度作为参数。在任务函数中,我们使用 PIL 库打开图片,并将其调整为指定的尺寸。然后,我们保存调整后的图片,并调用 upload_to_s3 函数将其上传到 Amazon S3。

4. 在视图函数中调用任务

接下来,我们需要在 Flask 的视图函数中调用任务函数。

# views.py
from flask import Flask, request
from .tasks import process_image

app = Flask(__name__)


@app.route('/upload', methods=['POST'])
def upload():
    image = request.files['image']
    width = request.form.get('width', type=int)
    height = request.form.get('height', type=int)
    image_path = save_image(image)
    process_image.delay(image_path, width, height)
    return 'Image processing started'


def save_image(image):
    # Code to save the uploaded image
    # ...

在上述代码中,我们定义了一个上传视图函数 /upload。该视图函数接收用户上传的图片文件,并从请求参数中获取调整后的宽度和高度。然后,我们调用 save_image 函数保存图片,并通过调用 process_image.delay 异步处理图片。最后,我们返回一个简单的消息,表示图片处理已经开始。

5. 配置并启动 Celery Worker

在完成任务函数和视图函数的编写后,我们还需要配置和启动 Celery Worker 来处理任务。

首先,我们创建一个 Celery Worker 配置文件 celeryconfig.py

# celeryconfig.py
from datetime import timedelta

CELERY_IMPORTS = ('yourapp.tasks',)
CELERY_TASK_RESULT_EXPIRES = timedelta(minutes=30)
CELERY_ENABLE_UTC = True
CELERY_TIMEZONE = 'UTC'

然后,我们使用以下命令启动 Celery Worker:

$ celery -A yourapp.celery worker --loglevel=INFO

6. 测试

我们可以使用 Postman 或其他工具发送包含图片和调整尺寸的请求来测试我们的应用。

发送 POST 请求到 /upload 路径,并在请求体中包含名为 image 的图片文件,同时在表单参数中指定调整后的宽度和高度。例如,发送以下请求:

POST /upload
Content-Type: multipart/form-data

image: <image file>
width: 500
height: 300

在请求成功后,我们可以观察到图片已被异步上传、调整大小并上传到 Amazon S3。

总结

本文介绍了在 Flask 中使用 Celery 完成图片上传、调整大小并存储到 Amazon S3 的任务。我们首先完成了准备工作,安装了必要的模块并配置了 Amazon S3 存储桶和 Flask 应用的配置文件。然后,我们编写了任务函数来处理图片上传和调整大小,并在 Flask 视图函数中调用任务函数。最后,我们配置并启动了 Celery Worker,并使用 Postman 进行了测试。

通过使用 Celery,我们能够异步处理耗时的任务,提高了网站的响应速度,并实现了高效的图片上传和处理。

Camera课程

Python教程

Java教程

Web教程

数据库教程

图形图像教程

办公软件教程

Linux教程

计算机教程

大数据教程

开发工具教程