djiango- asynchronous send mail --celery

installation

pip install celery == 4.2.0 # celery4.x support django1.11 later tried several versions to 4.2.0 can be sent successfully

1. Create a new project directory celery package celery_tasks

 tasks.py in

from django.conf Import Settings
 from the django.core.mail Import the send_mail 

from celery Import Celery   # Import celery packet # Create a class instance object Celery 
# Celery (name (generally written package name), intermediaries Broke) 
App = Celery ( ' celery_tasks .tasks ' , Broker = ' Redis: //192.168.199.130: 6379/2 ' )   # 2 uses the second database 


# define task function 
@ app.task   # decorative essential 
DEF send_register_active_email (to_email, username, token):
     # '' 'send activation email' ''
    # Organize mail message 
    # Send Mail 
    Subject = ' daily fresh welcome message '   # Message Subject 
    # Message Body 
    # Note: Here is the html tag will not be parsed as a string output 
    # the Message = '<h1> S% , you are welcome to become registered members every day, fresh </ h1> click on the following link to activate your account: <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   # sender 
    Receiver = [to_email]   # recipient list 
    html_message = '<h1>% s, welcome you to become registered members every day, fresh </ h1> click on the following link to activate your account <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)
     # the send_mail (message subject, message body, sender, close wHO iS list, html_message = HTML formatted content) 
    # send_mail (Subject, the Message, SENDER, Receiver) 
    send_mail (Subject, the Message, SENDER, Receiver, html_message = html_message)

2. Import function tasks package in view on the line

from celery_tasks.tasks Import send_register_active_email   # method of introducing the celery email 

# Send Mail 
# Delay (recipient, user name, token) 
send_register_active_email.delay (In Email, username, token)   # the task into the queue

3. Start redis

 

 Celery command execution

celery -A celery_tasks.tasks worker -l info

An error

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)

This is because the pip did not install redis

Installation Components redis

pip install -U "celery[redis]"

Command again knock on it

Continue error when sending mail

[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 has not been initialized due

In tasks.py initialization file

Import os
 Import Django 
os.environ.setdefault ( " DJANGO_SETTINGS_MODULE " , " dailyfresh.settings " )   # copy from wsgi.py in over 
django.setup ()

Test again sent successfully

Guess you like

Origin www.cnblogs.com/yifengs/p/11586380.html