2017-02-15 1 views
0

Я пытаюсь создать контактную форму с python django, на данный момент он работает отлично, проблема в том, что мне нужно подождать, пока сообщение электронной почты уже отправлено, чтобы получить Httpresponse.Django: return Httpresponse перед отправкой по электронной почте

Есть ли способ вернуть Httpresponse, а затем отправить сообщение электронной почты?

send_mail(
    'Subject here', 
    data['comentarios'], 
    '[email protected]', 
    ['[email protected]'], 
    fail_silently=False, 
      ) 

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

вы можете использовать любой механизм задачи shecduling (сельдерей, Huey и т.д.), это позволит решить проблему. – Cadmus

+0

использовать http://michal.karzynski.pl/blog/2014/05/18/setting-up-an-asynchronous-task-queue-for-django-using-celery-redis/ для установки –

ответ

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'], 
       '[email protected]', 
       ['[email protected]'], 
       fail_silently=False, 
      ) 
      return JsonResponse({'success': 'Just a JSON response to show things went ok.'}) 
     return JsonResponse({'error': 'Oops, invalid request.'}) 
+0

, но это то же самое , вы правы, это то, что я пытаюсь сделать, но если вы видите представление python, сначала отправьте электронное письмо, чем отправьте данные успеха. что именно то, что у меня есть, позвольте мне показать вам. \t \t успех: функция (данные) { \t \t \t если (данные == '') { \t \t \t \t оповещения ('Telefono Malo') \t \t \t} \t \t \t \t \t \t \t \t \t}, \t \t \t \t \t отказ: функция (данные) { \t \t \t предупреждение ('Ошибка en el envío interno de datos'); \t \t \t} –

+0

@Elarquitecto ах, но обратите внимание, что «Спасибо» показано ДОПОЛНИТЕЛЬНЫЙ запрос AJAX - так что вы показываете Спасибо, прежде чем отправлять письмо. Если что-то пойдет не так, вы можете использовать ответ AJAX для изменения ответа. –

+0

Вы предлагаете во всех проверках использовать JQuery вместо python? Сейчас он работает, но проблема в том, что я управлять ошибку в питона, смотрите, например, этот: попробуйте: \t \t Int (данные [ «Контактный телефон»]) \t кроме: \t \t возвращение HttpResponse ('badtel '), поэтому, если пользователь набирает номер телефона примерно так же, как это 12345678A, очевидно, что это не номер, тогда python отправляет сообщение об ошибке, которое, как предполагается, должно выполняться в интерфейсе. –

Смежные вопросы