Django:在发送电子邮件之前返回Httpresponse

时间:2017-02-15 02:59:46

标签: python django email

我正在尝试与python django建立联系表单,此时它运行正常,问题是我必须等到已发送的电子邮件消息才能获得Httpresponse

有没有办法先退回Httpresponse然后发送电子邮件?

    send_mail(
    'Subject here',
    data['comentarios'],
    'myemail@gmail.com',
    ['myemail@gmail.com'],
    fail_silently=False,
            )

return HttpResponse('bien') #es menor a 7 digitos   

1 个答案:

答案 0 :(得分:1)

我认为您希望让用户看到电子邮件已发送/请求已在点击“发送”后立即处理。我建议您使用AJAX来实现您的目标。

思维过程

需要注意的一点是,您可能需要show a loading gif/svg或其他内容来表明电子邮件正在发送过程中。显示加载gif时,继续进行表单验证:

  • 如果一切正常:继续使用AJAX请求发送电子邮件并返回成功/错误消息,指示是否已发送电子邮件。

  • 如果验证失败:只显示错误消息

但是,如果您想要显示一条消息,例如'感谢您,那就是这样的:

它应该在你的JS中看起来像这样(如果你正在使用jQuery):

$('#form').on('submit', function(e) {
    e.preventDefault();
    // do some validation
    // if the validation deems the form to be OK - display the 'Thank you!` message first THEN proceed to AJAX request.

    $('#form').append('Thank you!');

    // insert AJAX here
    ...

    // if the validation returns errors - just display errors
    ...        
});

实际的AJAX请求:

    // AJAX request
    $.ajax({
        method: 'POST',
        url: '../send_email/', # Just an example - this should be a url that handles a POST request and sends an email as a response
        data: $('#form').serialize(),
        success: function(response) {
            // anything you want
            // an example would be:
            if (response.success) {
                $('#form').append(response.success);
            }
    });

views.py

class SendEmail(View):

    def post(self, request, *args, **kwargs):
        if request.is_ajax():
            send_mail(
                'Subject here',
                data['comentarios'],
                'myemail@gmail.com',
                ['myemail@gmail.com'],
                fail_silently=False,
            )
            return JsonResponse({'success': 'Just a JSON response to show things went ok.'})
        return JsonResponse({'error': 'Oops, invalid request.'})