对于Django中celery的使用项目实例攻略,我将按照以下步骤来进行详细讲解:
- 安装celery
在Django项目中使用celery,需要先通过pip安装celery。在命令行中输入以下命令可以安装celery:
pip install celery
- 配置celery
在Django项目的settings.py中配置celery。首先,需要添加以下内容:
CELERY_BROKER_URL = 'amqp://guest:guest@localhost:5672//'
CELERY_ACCEPT_CONTENT = ['application/json']
CELERY_RESULT_BACKEND = 'django-db'
这些值的含义如下:
CELERY_BROKER_URL
:对于celery来说,broker是接收和传递消息的中间人。可以选择多种broker,如RabbitMQ、Redis等。在这个示例中,我们使用的是RabbitMQ。CELERY_ACCEPT_CONTENT
:该配置项指定了worker可以接受的任务格式。这里我们选择了json格式。CELERY_RESULT_BACKEND
:该配置项指定了将结果存储到哪里。这里我们选择了Django数据库。
接下来,需要在项目的__init__.py
文件中添加如下内容:
from celery import Celery
app = Celery('proj')
app.config_from_object('django.conf:settings', namespace='CELERY')
app.autodiscover_tasks()
- 定义任务
在Django项目中,需要使用Celery装饰器@app.task
来定义celery任务。例如,下面是一个简单的示例:
from celery import shared_task
@shared_task
def add(x, y):
return x + y
这个任务的定义非常简单,它将两个参数相加并返回结果。这个任务可以被其他Django应用调用。
- 异步执行任务
在Django应用中,我们可以使用.delay()
方法来异步执行任务。例如:
from .tasks import add
result = add.delay(4, 4)
这个任务将会被放到任务队列中,然后被worker消费执行。
- 监控任务状态
在Django中,可以使用AsyncResult
类来获取任务的状态。例如:
from .tasks import add
result = add.delay(4, 4)
while result.state == 'PENDING':
time.sleep(0.5)
print(result.state)
这个示例中,我们发送一个任务并等待它完成。如果任务是PENDING
状态,我们等待了0.5秒,再次查询任务状态,直到任务完成并返回任务状态。
- 示例1:发送邮件
下面是一个示例,我们通过Celery异步发送邮件。
首先需要在Django的settings.py中添加如下内容:
EMAIL_BACKEND = 'django.core.mail.backends.smtp.EmailBackend'
EMAIL_HOST = 'smtp.gmail.com'
EMAIL_PORT = 587
EMAIL_USE_TLS = True
EMAIL_HOST_USER = 'your-email-address@gmail.com' # 发送邮件的邮箱地址
EMAIL_HOST_PASSWORD = 'your-email-password' # 发送邮件的邮箱密码
然后,我们定义一个任务并调用Django内置的send_mail
函数:
from celery import shared_task
from django.core.mail import send_mail
@shared_task
def send_email_task(subject, message, from_email, recipient_list):
send_mail(subject, message, from_email, recipient_list)
这个任务使用了shared_task
装饰器来定义任务。我们可以异步地添加这个任务,例如:
from .tasks import send_email_task
result = send_email_task.delay('subject', 'message', 'from-email', ['recipient-list'])
当这个任务完成后,将会异步发送邮件。
- 示例2:使用Celery执行爬虫
下面是另外一个示例,我们可以使用Celery来执行Python爬虫。
在这个示例中,我们将使用Scrapy来爬取网站的数据。首先需要安装Scrapy,可以使用以下命令:
pip install scrapy
然后,我们创建一个Scrapy项目,并实现爬取网站的代码。在这个示例中,我们使用了一个简单的Spider,它从新浪新闻网上抓取了一些新闻标题。
import scrapy
class SinaNewsSpider(scrapy.Spider):
name = "sina_news"
allowed_domains = ["sina.com.cn"]
start_urls = [
"https://news.sina.com.cn/"
]
def parse(self, response):
for sel in response.xpath('//h2'):
title = sel.xpath('a/text()').extract_first()
print(title)
然后,我们使用Celery来异步执行这个爬虫:
from scrapy import spiderloader
from scrapy.utils.project import get_project_settings
from scrapy.crawler import CrawlerRunner
@shared_task
def crawl_news_task():
spider_loader = spiderloader.SpiderLoader(get_project_settings())
spider = spider_loader.load('sina_news')
runner = CrawlerRunner(get_project_settings())
deferred = runner.crawl(spider)
deferred.addBoth(lambda _: reactor.stop())
reactor.run()
在这个示例中,我们使用了Scrapy的类来加载Spider和CrawlerRunner对象。最后,我们返回Deferred对象以使任务异步执行。
以上就是针对Django中celery的使用项目实例的完整攻略,其中包含了2个示例。这些示例可以帮助开发者更好地理解Django中celery的使用方法。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Django中celery的使用项目实例 - Python技术站