Will requests to my site lag and work slowly in django while waiting for celery results?
I use django to create pdf to docx converter using pdf2docx library, and I need to wait a celery task to done and get result from it. Will my site lag and work slowly if a lot of users use it, and how can I do it better? here my views and celery code
views.py '''
from django.shortcuts import render
from django.http import JsonResponse, HttpResponse
from django.http.request import HttpRequest
import tempfile
import os
from .forms import FileUploadForm
from django.views.decorators.csrf import csrf_protect
from . import tasks
from celery.result import AsyncResult
@csrf_protect
def main_page(request: HttpRequest):
if request.method == "GET":
# get
form = FileUploadForm(request.POST, request.FILES)
context = {
"form": form
}
return render(request, 'main/main_page.html', context)
if request.method == 'POST' and request.FILES.get('file'):
form = FileUploadForm(request.POST, request.FILES)
if form.is_valid():
# get file
file = request.FILES['file']
size_limit = 2 * 1024 * 1024
# save pdf
with tempfile.NamedTemporaryFile(delete=False, suffix=".pdf") as temp_file:
if file.size > size_limit:
for chunk in file.chunks():
temp_file.write(chunk)
else:
temp_file.write(file.read())
temp_pdf_path = temp_file.name
# start convertor task
task: AsyncResult = tasks.convert_pdf_to_docx.delay(temp_pdf_path)
# get docx path
temp_docx_path = task.wait(timeout=None, interval=0.5)
converted_file_name = str(file).replace(".pdf", "")
# read docx file and set it in response
with open(temp_docx_path, 'rb') as docx_file:
file_data = docx_file.read()
response = HttpResponse(file_data, content_type='application/vnd.openxmlformats-officedocument.wordprocessingml.document')
response['Content-Disposition'] = f'attachment; filename={converted_file_name}.docx'
response['Content-Length'] = len(file_data) # calculate length of content
# Clean up temp files
os.remove(temp_pdf_path)
os.remove(temp_docx_path)
return response
else:
context = {
"form": form,
"submit_error": True,
}
return render(request, 'main/main_page.html', context)
'''
tasks.py '''
from celery import shared_task
from pdf2docx import Converter
@shared_task()
def convert_pdf_to_docx(temp_pdf_path):
# Convert to DOCX
temp_docx_path = temp_pdf_path.replace(".pdf", ".docx")
cv = Converter(temp_pdf_path)
cv.convert(temp_docx_path)
cv.close()
return temp_docx_path
'''
to run celery I use: '''
celery -A pdfconverter worker --loglevel=info -P gevent
'''