ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

Django 使用Celery处理异步任务

2021-05-04 21:51:18  阅读:142  来源: 互联网

标签:异步 tasks celery py redis Django Celery import mail


  1. 本实验通过Django 异步发送邮件作为示例

 
a.Celery实际上是生产者消费者模型来实现异步的:
Django 使用Celery处理异步任务

 

b.实验所需组件:
1) Django
2) Celery
3) Redis

 

2.实验代码
a.启动redis-server

#./redis-server /etc/redis/redis.conf

#cat /etc/redis/redis.conf
bind 192.168.60.72
port 6379
daemonize yes
dbfilename dump.rdb
dir /var/lib/redis
logfile "/var/log/redis/redis-server.log"

#ss -antlp | grep 6379
LISTEN     0      128    192.168.60.72:6379                     *:*                   users:(("redis-server",pid=77880,fd=6))

b.配置Django

#django-admin startproject send_mail_prj
#cd send_mail_prj
#django-admin startapp app01

创建Celery相关文件:
├─manage.py
│
├─app01
│  │  admin.py
│  │  apps.py
│  │  models.py
│  │  tests.py
│  │  urls.py
│  │  utils.py
│  │  views.py
│  ├─__init__.py
│
├─celery_tasks  //创建如下文件
│  │  config.py
│  │  main.py
│  │  __init__.py
│  │
│  ├─sms
│     │  tasks.py
│     └─__init__.py
│   
│
└─send_mail_prj
    │  asgi.py
    │  settings.py
    │  urls.py
    │  wsgi.py
    │─ __init__.py

 

#celery_tasks.init.py为空

 

#celery_tasks.config.py

# Celery 配置文件
broker_url = 'redis://192.168.60.72/10'

#celery_tasks.main.py

# celery入口
from celery import Celery
# 初始化celery实例
celery_app = Celery('send_mail')
# 加载celery配置
celery_app.config_from_object('celery_tasks.config')
# 注册任务
celery_app.autodiscover_tasks(['celery_tasks.sms'])

 

#celery_tasks.sms.init.py 为空

 

#celery_tasks.sms.tasks.py

from celery_tasks.main import celery_app
from email.mime.text import MIMEText
import smtplib

# 定义异步任务
@celery_app.task(name='send_mail')
def sendEmail():
    # 设置服务器所需信息
    # 163邮箱服务器地址
    mail_host = 'smtp.163.com'
    # 163用户名
    mail_user = 'yxxxx5'
    # 密码(部分邮箱为授权码)
    mail_pass = 'KIMxxxxxxxxxxxZ'
    # 邮件发送方邮箱地址
    sender = 'yxxxx5@163.com'
    # 邮件接受方邮箱地址,注意需要[]包裹,这意味着你可以写多个邮件地址群发
    receivers = ['yxxxx5@163.com']

    # 设置email信息
    # 邮件内容设置
    message = MIMEText('dear frank, sdfsdfsdfasfdsdfsfwetrwre', 'plain', 'utf-8')
    # 邮件主题
    message['Subject'] = 'hi fxxxg sir sdfsfsdfasf'
    # 发送方信息
    message['From'] = sender
    # 接受方信息
    message['To'] = receivers[0]

    # 登录并发送邮件
    try:
        smtpObj = smtplib.SMTP()
        # 连接到服务器
        smtpObj.connect(mail_host, 25)
        # 登录到服务器
        smtpObj.login(mail_user, mail_pass)
        # 发送
        smtpObj.sendmail(
            sender, receivers, message.as_string())
        # 退出
        smtpObj.quit()
        return ('success')
    except smtplib.SMTPException as e:
        print('error', e)  # 打印错误

 

3.Django写视图函数和配置URL
#app01.views.py

from django.http import HttpRequest, HttpResponse
# 导入异步任务
from celery_tasks.sms.tasks import sendEmail

# Create your views here.

def register(request):
    # 发送邮件
    sendEmail.delay()
    return HttpResponse('hello')

 

#app01.urls.py

from django.conf.urls import url
from . import  views

urlpatterns = [
    url(r'register/$', views.register, name='register'),
]

 

#send_mail_prj.urls.py

from django.contrib import admin
from django.urls import path
from django.conf.urls import url, include

urlpatterns = [
    path('admin/', admin.site.urls),
    url(r'^', include('app01.urls')),
]

 

4.启动Celery
#cd send_mail_prj
#celery -A celery_tasks.main worker -l info
#celery -A celery_tasks.main worker -l info -P eventlet //windows下面需要添加-P eventlet

 

5.启动django
#cd send_mail_prj
#python manage.py runserver 0.0.0.0:80

 

6.访问127.0.0.1/register/
Django 使用Celery处理异步任务
Django 使用Celery处理异步任务
Django 使用Celery处理异步任务

 
实验完成。

标签:异步,tasks,celery,py,redis,Django,Celery,import,mail
来源: https://blog.51cto.com/jackor/2752931

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有