zoukankan      html  css  js  c++  java
  • djiango-异步发送邮件--celery

    安装

    pip install celery==4.2.0   # celery4.x支持django1.11以上版本 试了好几个版本 就4.2.0能发送成功

    1.项目目录里新建一个celery的包celery_tasks

     tasks.py中

    from django.conf import settings
    from django.core.mail import send_mail
    
    from celery import Celery  # 导入celery包# 创建一个Celery类的实例对象
    # Celery(名称(一般写包名), 中间人broke)
    app = Celery('celery_tasks.tasks', broker='redis://192.168.199.130:6379/2')  # 2 使用第二个数据库
    
    
    # 定义任务函数
    @app.task  # 装饰 必不可少
    def send_register_active_email(to_email, username, token):
        # '''发送激活邮件'''
        # 组织邮件信息
        # 发送邮件
        subject = '天天生鲜欢迎信息'  # 邮件主题
        # 邮件正文
        # 注:此处html标签是不会被解析出来 会当作字符串输出
        # message = '<h1>%s, 欢迎您成为天天生鲜注册会员</h1>请点击下面链接激活您的账户:<br/><a href="http://192.168.199.130:8000/user/active/%s">http://192.168.199.130:8000/user/active/%s</a>' % (username, token, token)
        message = ''
        sender = settings.EMAIL_FROM  # 发件人
        receiver = [to_email]  # 收件人列表
        html_message = '<h1>%s, 欢迎您成为天天生鲜注册会员</h1>请点击下面链接激活您的账户<br/><a href="http://192.168.199.130:8000/user/active/%s">http://192.168.199.130:8000/user/active/%s</a>' % (
        username, token, token)
        print(html_message)
        # send_mail(邮件主题, 邮件正文, 发件人, 收件人列表, html_message=HTML格式的内容)
        # send_mail(subject, message, sender, receiver)
        send_mail(subject, message, sender, receiver, html_message=html_message)

    2.在视图函数中导入tasks包就行

    from celery_tasks.tasks import send_register_active_email  # 导入celery发邮件的方法
    
    # 发送邮件
    # delay(收件人, 用户名, token)
    send_register_active_email.delay(email, username, token)  # 把任务放入队列

    3.启动redis

     执行celery命令

    celery -A celery_tasks.tasks worker -l info

    报错

    python@ubuntu:~/bj19/ttsx/dailyfresh$ celery -A celery_tasks.tasks worker -l info
    Traceback (most recent call last):
      File "/usr/local/bin/celery", line 11, in <module>
        sys.exit(main())
      File "/usr/local/lib/python3.5/dist-packages/celery/__main__.py", line 16, in main
        _main()
      File "/usr/local/lib/python3.5/dist-packages/celery/bin/celery.py", line 322, in main
        cmd.execute_from_commandline(argv)
      File "/usr/local/lib/python3.5/dist-packages/celery/bin/celery.py", line 496, in execute_from_commandline
        super(CeleryCommand, self).execute_from_commandline(argv)))
      File "/usr/local/lib/python3.5/dist-packages/celery/bin/base.py", line 298, in execute_from_commandline
        return self.handle_argv(self.prog_name, argv[1:])
      File "/usr/local/lib/python3.5/dist-packages/celery/bin/celery.py", line 488, in handle_argv
        return self.execute(command, argv)
      File "/usr/local/lib/python3.5/dist-packages/celery/bin/celery.py", line 420, in execute
        ).run_from_argv(self.prog_name, argv[1:], command=argv[0])
      File "/usr/local/lib/python3.5/dist-packages/celery/bin/worker.py", line 223, in run_from_argv
        return self(*args, **options)
      File "/usr/local/lib/python3.5/dist-packages/celery/bin/base.py", line 252, in __call__
        ret = self.run(*args, **kwargs)
      File "/usr/local/lib/python3.5/dist-packages/celery/bin/worker.py", line 257, in run
        **kwargs)
      File "/usr/local/lib/python3.5/dist-packages/celery/worker/worker.py", line 101, in __init__
        self.setup_instance(**self.prepare_args(**kwargs))
      File "/usr/local/lib/python3.5/dist-packages/celery/worker/worker.py", line 124, in setup_instance
        self.should_use_eventloop() if use_eventloop is None
      File "/usr/local/lib/python3.5/dist-packages/celery/worker/worker.py", line 243, in should_use_eventloop
        self._conninfo.transport.implements.asynchronous and
      File "/usr/local/lib/python3.5/dist-packages/kombu/connection.py", line 871, in transport
        self._transport = self.create_transport()
      File "/usr/local/lib/python3.5/dist-packages/kombu/connection.py", line 598, in create_transport
        return self.get_transport_cls()(client=self)
      File "/usr/local/lib/python3.5/dist-packages/kombu/transport/redis.py", line 1039, in __init__
        raise ImportError('Missing redis library (pip install redis)')
    ImportError: Missing redis library (pip install redis)

    这是因为pip没装redis

    安装redis组件

    pip install -U "celery[redis]"

    再次敲命令就可以了

    发送邮件时继续报错

    [2019-09-25 17:41:28,074: INFO/MainProcess] Received task: celery_tasks.tasks.send_register_active_email[58be8ac2-4deb-4ca1-809b-6a88e9a2fc9f]  
    [2019-09-25 17:41:28,085: ERROR/ForkPoolWorker-2] Task celery_tasks.tasks.send_register_active_email[58be8ac2-4deb-4ca1-809b-6a88e9a2fc9f] raised unexpected: ImproperlyConfigured('Requested setting EMAIL_FROM, but settings are not configured. You must either define the environment variable DJANGO_SETTINGS_MODULE or call settings.configure() before accessing settings.',)
    Traceback (most recent call last):
      File "/home/python/.virtualenvs/bj19/lib/python3.5/site-packages/celery/app/trace.py", line 382, in trace_task
        R = retval = fun(*args, **kwargs)
      File "/home/python/.virtualenvs/bj19/lib/python3.5/site-packages/celery/app/trace.py", line 641, in __protected_call__
        return self.run(*args, **kwargs)
      File "/home/python/bj19/ttsx/dailyfresh/celery_tasks/tasks.py", line 24, in send_register_active_email
        sender = settings.EMAIL_FROM  # 发件人
      File "/home/python/.virtualenvs/bj19/lib/python3.5/site-packages/django/conf/__init__.py", line 48, in __getattr__
        self._setup(name)
      File "/home/python/.virtualenvs/bj19/lib/python3.5/site-packages/django/conf/__init__.py", line 42, in _setup
        % (desc, ENVIRONMENT_VARIABLE))
    django.core.exceptions.ImproperlyConfigured: Requested setting EMAIL_FROM, but settings are not configured. You must either define the environment variable DJANGO_SETTINGS_MODULE or call settings.configure() before accessing settings.

    django没有初始化导致的

    在tasks.py文件中初始化

    import os
    import django
    os.environ.setdefault("DJANGO_SETTINGS_MODULE", "dailyfresh.settings")  # 从wsgi.py中复制过来
    django.setup()

    再次测试,发送成功

  • 相关阅读:
    装箱与拆箱
    java中final的用法
    一次坑爹的Oracle in查询
    Spring-Security-Oauth整合Spring-Security,拦截器
    jvisualvm连接远程Tomcat
    7.Spring-Cloud服务容错保护之Hystrix初探
    8.Spring-Cloud-Hystrix之异常处理
    9.Spring-Cloud-Hystrix之请求缓存(踩坑)
    10.Spring-Cloud-Hystrix之熔断监控Hystrix Dashboard单个应用
    11.Spring-Cloud-Hystrix之熔断监控Turbine
  • 原文地址:https://www.cnblogs.com/yifengs/p/11586380.html
Copyright © 2011-2022 走看看