简体   繁体   中英

Celery has DNS resolution problems?

I used Celery for email registration asynchronously, but when I trigger this asynchronous request, the following error will appear

Traceback (most recent call last):
  File "d:\python3\lib\site-packages\dns\resolver.py", line 982, in nameservers
    raise NotImplementedError
NotImplementedError

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "d:\python3\lib\site-packages\celery\app\trace.py", line 451, in trace_task
    R = retval = fun(*args, **kwargs)
  File "d:\python3\lib\site-packages\celery\app\trace.py", line 734, in __protected_call__
    return self.run(*args, **kwargs)
  File "E:\Exploit_blog\blog_index_html\tasks.py", line 9, in send_email
    send_mail(
  File "d:\python3\lib\site-packages\django\core\mail\__init__.py", line 61, in send_mail
    return mail.send()
  File "d:\python3\lib\site-packages\django\core\mail\message.py", line 284, in send
    return self.get_connection(fail_silently).send_messages([self])
  File "d:\python3\lib\site-packages\django\core\mail\backends\smtp.py", line 102, in send_messages
    new_conn_created = self.open()
  File "d:\python3\lib\site-packages\django\core\mail\backends\smtp.py", line 62, in open
    self.connection = self.connection_class(self.host, self.port, **connection_params)
  File "d:\python3\lib\smtplib.py", line 1034, in __init__
    SMTP.__init__(self, host, port, local_hostname, timeout,
  File "d:\python3\lib\smtplib.py", line 253, in __init__
    (code, msg) = self.connect(host, port)
  File "d:\python3\lib\smtplib.py", line 339, in connect
    self.sock = self._get_socket(host, port, self.timeout)
  File "d:\python3\lib\smtplib.py", line 1040, in _get_socket
    new_socket = super()._get_socket(host, port, timeout)
  File "d:\python3\lib\smtplib.py", line 310, in _get_socket
    return socket.create_connection((host, port), timeout,
  File "d:\python3\lib\site-packages\eventlet\green\socket.py", line 44, in create_connection
    for res in getaddrinfo(host, port, 0, SOCK_STREAM):
  File "d:\python3\lib\site-packages\eventlet\support\greendns.py", line 543, in getaddrinfo
    qname, addrs = _getaddrinfo_lookup(host, family, flags)
  File "d:\python3\lib\site-packages\eventlet\support\greendns.py", line 505, in _getaddrinfo_lookup
    answer = resolve(host, qfamily, False, use_network=use_network)
  File "d:\python3\lib\site-packages\eventlet\support\greendns.py", line 450, in resolve
    return _proxy.query(name, rdtype, raise_on_no_answer=raises,
  File "d:\python3\lib\site-packages\eventlet\support\greendns.py", line 394, in query
    step(self._resolver.query, qname, rdtype, rdclass, tcp, source, raise_on_no_answer=False)
  File "d:\python3\lib\site-packages\eventlet\support\greendns.py", line 334, in _resolver
    self.clear()
  File "d:\python3\lib\site-packages\eventlet\support\greendns.py", line 342, in clear
    self._resolver = dns.resolver.Resolver(filename=self._filename)
  File "d:\python3\lib\site-packages\dns\resolver.py", line 756, in __init__
    self.read_registry()
  File "d:\python3\lib\site-packages\dns\resolver.py", line 858, in read_registry
    self.nameservers = info.nameservers
  File "d:\python3\lib\site-packages\dns\resolver.py", line 984, in nameservers
    raise ValueError(f'nameserver {nameserver} is not an '
ValueError: nameserver ; is not an IP address or valid https URL

There is no problem with the celery tasks code, because I was able to use it before, but the above situation appeared after I changed a computer

tasks code

from django.core.mail import send_mail

from celery import shared_task


# 发送邮件验证码,使用task进行异步处理,获取从视图层获取来的值,然后发送到用户邮箱中
@shared_task
def send_email(request, rand_str):
    send_mail(
        subject='验证码',
        message='你的验证码为:' + rand_str + '请不要将你的验证码告诉其他人',
        from_email='TEXT',
        recipient_list=[request],
        fail_silently=False
    )
    return (request, rand_str)

main settings

EMAIL_BACKEND = 'django.core.mail.backends.smtp.EmailBackend'
EMAIL_USE_TLS = False 
EMAIL_USE_SSL = True  
EMAIL_HOST = 'smtp.gmail.com'  
EMAIL_PORT = 587
EMAIL_HOST_USER = 'xxx'  
EMAIL_HOST_PASSWORD = 'xxx' 

.> celery exchange=celery(direct) key=celery

Celery startup console can recognize this tasks

[tasks]
  . Let.tasks.add
  . blog_index_html.tasks.send_email

When I searched for a few days, I determined the BUG location, it turned out that the eventlet and dnspython modules were incompatible, and I found a solution in his official GIT repository.
My operation is to uninstall and reinstall the dnspython module

github link

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM