在Django中使用Celery进行PDF生成

2023-04-11 00:00:00 django celery 生成

Celery是一个开源的分布式任务队列,它可以让我们在Django中异步执行耗时的任务,如生成PDF等。

安装Celery

首先,我们需要安装Celery。在终端中输入以下命令:

pip install celery

接着,在Django项目的settings.py文件中加入以下配置:

CELERY_BROKER_URL = 'amqp://guest:guest@localhost:5672//'
CELERY_RESULT_BACKEND = 'rpc://'

配置完成后,我们就可以开始使用Celery了。

生成PDF任务

接下来,我们可以定义一个生成PDF的任务。在Django项目中,我们可以创建一个tasks.py文件,用于存放任务函数。以下示例代码演示了如何使用xhtml2pdf库生成PDF,并将生成的PDF保存到本地。

from celery import shared_task
from xhtml2pdf import pisa
import os

@shared_task
def generate_pdf(content):
filename = 'pidancode.pdf' # PDF文件名
pdf_path = os.path.join(os.getcwd(), 'pdfs', filename) # PDF保存路径
with open(pdf_path, 'w+b') as pdf_file:
pisa_status = pisa.CreatePDF(content.encode('utf-8'), dest=pdf_file)
if pisa_status.err:
raise Exception('PDF generation error.')
return pdf_path

在上述代码中,我们使用了xhtml2pdf库来生成PDF文件,并使用os模块获取文件保存路径。生成PDF文件的函数使用了@shared_task装饰器,这个装饰器使得函数成为Celery任务。

将任务加入队列

使用Celery进行异步执行任务的方法是将任务加入队列。我们可以在Django中的视图函数中调用我们先前定义的generate_pdf函数,并把函数加入到Celery队列中。以下示例代码展示了如何使用Celery处理视图函数中的耗时任务。

from django.shortcuts import render
from django.http import HttpResponse
from .tasks import generate_pdf

def pdf_view(request):
content = '

pidancode.com

' # HTML内容
pdf_task = generate_pdf.delay(content) # 将任务加入队列
return HttpResponse(pdf_task.id) # 返回任务ID

在上述代码中,我们定义了一个pdf_view函数。pdf_view函数接收一个请求,生成一个包含字符串“pidancode.com”的HTML内容,然后将生成PDF的任务加入到Celery队列中。在队列中执行任务时返回的是任务ID,我们可以在视图函数中将其返回给用户,以便用户可以查询任务的执行状态。

查询任务状态

在Django中,我们可以使用Celery提供的接口查询任务的执行状态。以下示例代码演示了如何获取任务的执行状态。

from celery.result import AsyncResult
from django.http import JsonResponse

def status_view(request):
task_id = request.GET.get('task_id') # 获取任务ID
task_result = AsyncResult(task_id)
response_data = {'status': task_result.status}
if task_result.status == 'SUCCESS': # 获取任务执行结果
response_data['result'] = task_result.result
return JsonResponse(response_data)

在上述代码中,我们定义了一个status_view函数。status_view函数将任务ID作为参数,使用AsyncResult获取任务的执行状态。如果任务已经执行完成,我们可以使用task_result.result获取生成的PDF文件路径。最终,我们使用JsonResponse将任务状态返回给用户。

总结

本文介绍了如何在Django中使用Celery进行PDF生成。我们定义了生成PDF的任务函数,并将任务加入到Celery队列中进行异步执行。同时,我们还可以通过Celery提供的接口获取任务的执行状态,以便将执行结果返回给用户。

相关文章