【问题标题】:Django: return Httpresponse before sending emailDjango:在发送电子邮件之前返回 Httpresponse
【发布时间】:2017-02-15 02:59:46
【问题描述】:

我正在尝试使用 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   

【问题讨论】:

标签: python django email


【解决方案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.'})

【讨论】:

  • 但它是一样的,你是对的,这就是我想要做的,但如果你看到 python 视图,首先发送电子邮件,而不是发送成功数据。那正是我所拥有的,让我告诉你。成功:函数(数据){ if (data == ''){ alert('telefono malo') } },失败:function(data) { alert('Error en el envío interno de datos'); }
  • @Elarquitecto 啊,但请注意,在发出 AJAX 请求之前会显示“谢谢” - 所以在发送电子邮件之前会显示“谢谢”。如果出现问题,您可以使用 AJAX 响应来更改响应。
  • 您是否建议在所有验证中我使用 Jquery 而不是 python?它现在正在工作,但这里的问题是我正在管理 python 中的错误,例如这个:try: int(data['telefono']) except: return HttpResponse('badtel'),所以如果用户输入电话号码类似于 12345678A 它显然不是一个数字然后 python 发送一个错误,它应该在前端进行管理。
  • 是的,我会说将您的验证放在 jQuery 中 - 所以如果表单有任何问题,它不会传递到后端并且会显示错误消息。只有数据正确,才会显示成功信息,并通过 AJAX 将表单数据传递给 Django。
  • 如果您的用户键入 12345678A - 如果您的验证在您的前端正确完成,它将不会传递到您的服务器,也不需要try... except... 阻止以捕获错误。另外,如有必要,您应该使用form.is_valid()form.cleaned_data['telfono'] 来帮助您进行后端验证(例如,如果用户没有启用JS,您将不得不进行服务器端验证。但是,这意味着您除非您使用芹菜之类的东西,否则无法在发送电子邮件之前显示消息)
猜你喜欢
  • 2016-12-14
  • 2011-10-18
  • 2021-02-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-04-26
  • 2012-03-16
  • 1970-01-01
相关资源
最近更新 更多