Django - 邮件发送两次

3
每当我从views.py中使用下面所示的电子邮件设置调用以下方法时,会向收件人发送两份电子邮件,并显示以下错误:
def sendEmailBasic(request):
   msg = EmailMessage('Request Callback',
                      'Here is the message.', to=['example@gmail.com'])
    msg.send() 
    return HttpResponseRedirect('/')


Exception happened during processing of request from ('127.0.0.1', 58207)
Traceback (most recent call last):
  File "/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/SocketServer.py", line 593, in process_request_thread
self.finish_request(request, client_address)
  File "/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/SocketServer.py", line 334, in finish_request
self.RequestHandlerClass(request, client_address, self)
  File "/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/django/core/servers/basehttp.py", line 150, in __init__
super(WSGIRequestHandler, self).__init__(*args, **kwargs)
  File "/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/SocketServer.py", line 651, in __init__
self.finish()
  File "/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/SocketServer.py", line 710, in finish
self.wfile.close()
  File "/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/socket.py", line 279, in close
self.flush()
  File "/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/socket.py", line 303, in flush
self._sock.sendall(view[write_offset:write_offset+buffer_size])
error: [Errno 32] Broken pipe


DEFAULT_FROM_EMAIL = 'myemail@gmail.com'
SERVER_EMAIL = 'myemail@gmail.com'
EMAIL_USE_TLS = True
EMAIL_HOST = 'smtp.gmail.com'
EMAIL_PORT = 587
EMAIL_HOST_USER = 'myemail@gmail.com'
EMAIL_HOST_PASSWORD = 'my password'

哪个版本的Django?错误似乎是您的浏览器已经从Django开发服务器断开连接。在您的视图函数中放置一些日志/打印,以检查msg.send()需要多长时间。 - Reza Mohammadi
1个回答

2

浏览器通常会向它们能找到的任何URL发送HEAD请求。如果Django在HEAD请求上运行,然后再次在以下GET请求上运行,您将看到函数被调用两次。

考虑将“发送邮件”功能移动到POST请求中,或仅在真正的GET上发送电子邮件,而不是其他任何内容。

未经测试:

def sendEmailBasic(request):
   if request.method in ('GET', 'POST'):
       msg = EmailMessage('Request Callback',
                      'Here is the message.', to=['example@gmail.com'])
       msg.send() 
   return HttpResponseRedirect('/')

另请参阅:http://restcookbook.com/HTTP%20Methods/idempotency/


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接