以下是“详解django+django-celery+celery的整合实战”的完整攻略,包含两个示例说明。
简介
Django是一个流行的Python Web框架,它提供了许多功能强大的工具和库,可以帮助我们快速构建Web应用程序。Celery是一个Python分布式任务队列,它可以帮助我们异步执行任务。在本教程中,我们将使用Django框架和Celery库来实现异步任务处理。
示例1:发送电子邮件
以下是一个发送电子邮件的示例:
1. 安装Django和Celery
首先,我们需要安装Django和Celery。使用以下命令安装:
pip install django celery
2. 创建Django项目
使用以下命令创建Django项目:
django-admin startproject email_sender
3. 创建Django应用程序
使用以下命令创建Django应用程序:
cd email_sender
python manage.py startapp email
4. 配置Django和Celery
在email_sender
项目的settings.py
文件中,添加以下配置:
INSTALLED_APPS = [
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
'email',
'django_celery_results',
'django_celery_beat',
]
CELERY_BROKER_URL = 'redis://localhost:6379/0'
CELERY_RESULT_BACKEND = 'django-db'
CELERY_ACCEPT_CONTENT = ['application/json']
CELERY_RESULT_SERIALIZER = 'json'
CELERY_TASK_SERIALIZER = 'json'
CELERY_TIMEZONE = 'Asia/Shanghai'
CELERY_BEAT_SCHEDULE = {
'send-email-every-10-seconds': {
'task': 'email.tasks.send_email',
'schedule': 10.0,
},
}
在这个示例中,我们将email
应用程序添加到INSTALLED_APPS
中,并配置了Celery的Redis消息代理和Django数据库结果后端。我们还设置了Celery的序列化和时区,并定义了一个名为send-email-every-10-seconds
的定时任务。
在email_sender
项目的urls.py
文件中,添加以下配置:
from django.urls import path
from email.views import send_email_view
urlpatterns = [
path('send-email/', send_email_view, name='send_email'),
]
在这个示例中,我们将/send-email/
URL映射到send_email_view
视图。
在email_sender
项目的celery.py
文件中,添加以下配置:
import os
from celery import Celery
os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'email_sender.settings')
app = Celery('email_sender')
app.config_from_object('django.conf:settings', namespace='CELERY')
app.autodiscover_tasks()
在这个示例中,我们创建了一个名为app
的Celery应用程序,并从Django配置中加载Celery配置。我们还使用autodiscover_tasks
函数自动发现任务。
在email_sender
项目的__init__.py
文件中,添加以下配置:
from .celery import app as celery_app
__all__ = ['celery_app']
在这个示例中,我们将celery_app
导出为模块级别的变量。
5. 创建发送电子邮件任务
在email
应用程序的tasks.py
文件中,创建一个发送电子邮件任务:
from celery import shared_task
from django.core.mail import send_mail
@shared_task
def send_email():
send_mail(
'Subject here',
'Here is the message.',
'from@example.com',
['to@example.com'],
fail_silently=False,
)
在这个示例中,我们创建了一个名为send_email
的任务,使用send_mail
函数发送电子邮件。
6. 创建发送电子邮件视图
在email
应用程序的views.py
文件中,创建一个发送电子邮件视图:
from django.shortcuts import render
from email.tasks import send_email
def send_email_view(request):
send_email.delay()
return render(request, 'send_email.html')
在这个示例中,我们创建了一个名为send_email_view
的视图,使用delay
函数异步执行send_email
任务,并返回一个渲染的模板。
7. 创建发送电子邮件模板
在email
应用程序的templates
目录中,创建一个名为send_email.html
的模板:
{% extends 'base.html' %}
{% block content %}
<h2>Send Email</h2>
<form method="post" enctype="multipart/form-data">
{% csrf_token %}
<button type="submit">Send</button>
</form>
{% endblock %}
在这个示例中,我们创建了一个名为send_email.html
的模板,包含一个发送电子邮件表单。
8. 运行应用程序
使用以下命令运行应用程序:
celery -A email_sender worker -l info
celery -A email_sender beat -l info
python manage.py runserver
现在,您可以在浏览器中访问http://localhost:8000/send-email/
,发送电子邮件并查看Celery日志。
示例2:生成PDF文件
以下是一个生成PDF文件的示例:
1. 安装Django和Celery
首先,我们需要安装Django和Celery。使用以下命令安装:
pip install django celery
2. 安装WeasyPrint
我们还需要安装WeasyPrint,它是一个用于生成PDF文件的Python库。使用以下命令安装:
pip install WeasyPrint
3. 创建Django项目
使用以下命令创建Django项目:
django-admin startproject pdf_generator
4. 创建Django应用程序
使用以下命令创建Django应用程序:
cd pdf_generator
python manage.py startapp pdf
5. 配置Django和Celery
在pdf_generator
项目的settings.py
文件中,添加以下配置:
INSTALLED_APPS = [
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
'pdf',
'django_celery_results',
'django_celery_beat',
]
CELERY_BROKER_URL = 'redis://localhost:6379/0'
CELERY_RESULT_BACKEND = 'django-db'
CELERY_ACCEPT_CONTENT = ['application/json']
CELERY_RESULT_SERIALIZER = 'json'
CELERY_TASK_SERIALIZER = 'json'
CELERY_TIMEZONE = 'Asia/Shanghai'
CELERY_BEAT_SCHEDULE = {
'generate-pdf-every-10-seconds': {
'task': 'pdf.tasks.generate_pdf',
'schedule': 10.0,
},
}
在这个示例中,我们将pdf
应用程序添加到INSTALLED_APPS
中,并配置了Celery的Redis消息代理和Django数据库结果后端。我们还设置了Celery的序列化和时区,并定义了一个名为generate-pdf-every-10-seconds
的定时任务。
在pdf_generator
项目的urls.py
文件中,添加以下配置:
from django.urls import path
from pdf.views import generate_pdf_view
urlpatterns = [
path('generate-pdf/', generate_pdf_view, name='generate_pdf'),
]
在这个示例中,我们将/generate-pdf/
URL映射到generate_pdf_view
视图。
在pdf_generator
项目的celery.py
文件中,添加以下配置:
import os
from celery import Celery
os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'pdf_generator.settings')
app = Celery('pdf_generator')
app.config_from_object('django.conf:settings', namespace='CELERY')
app.autodiscover_tasks()
在这个示例中,我们创建了一个名为app
的Celery应用程序,并从Django配置中加载Celery配置。我们还使用autodiscover_tasks
函数自动发现任务。
在pdf_generator
项目的__init__.py
文件中,添加以下配置:
from .celery import app as celery_app
__all__ = ['celery_app']
在这个示例中,我们将celery_app
导出为模块级别的变量。
6. 创建生成PDF文件任务
在pdf
应用程序的tasks.py
文件中,创建一个生成PDF文件任务:
from celery import shared_task
from django.template.loader import render_to_string
from weasyprint import HTML
@shared_task
def generate_pdf():
html_string = render_to_string('pdf_template.html')
html = HTML(string=html_string)
html.write_pdf('output.pdf')
在这个示例中,我们创建了一个名为generate_pdf
的任务,使用render_to_string
函数渲染模板并使用weasyprint
库将HTML转换为PDF文件。
7. 创建生成PDF文件视图
在pdf
应用程序的views.py
文件中,创建一个生成PDF文件视图:
from django.shortcuts import render
from pdf.tasks import generate_pdf
def generate_pdf_view(request):
generate_pdf.delay()
return render(request, 'generate_pdf.html')
在这个示例中,我们创建了一个名为generate_pdf_view
的视图,使用delay
函数异步执行generate_pdf
任务,并返回一个渲染的模板。
8. 创建生成PDF文件模板
在pdf
应用程序的templates
目录中,创建一个名为generate_pdf.html
的模板:
{% extends 'base.html' %}
{% block content %}
<h2>Generate PDF</h2>
<form method="post" enctype="multipart/form-data">
{% csrf_token %}
<button type="submit">Generate</button>
</form>
{% endblock %}
在这个示例中,我们创建了一个名为generate_pdf.html
的模板,包含一个生成PDF文件表单。
9. 创建PDF模板
在pdf
应用程序的templates
目录中,创建一个名为pdf_template.html
的模板:
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>PDF Template</title>
</head>
<body>
<h1>PDF Template</h1>
<p>This is a PDF template.</p>
</body>
</html>
在这个示例中,我们创建了一个名为pdf_template.html
的模板,用于生成PDF文件。
10. 运行应用程序
使用以下命令运行应用程序:
celery -A pdf_generator worker -l info
celery -A pdf_generator beat -l info
python manage.py runserver
现在,您可以在浏览器中访问http://localhost:8000/generate-pdf/
,生成PDF文件并查看Celery日志。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:详解django+django-celery+celery的整合实战 - Python技术站