/ / Django: zwróć Httpresponse przed wysłaniem wiadomości e-mail - python, django, e-mail

Django: zwróć Httpresponse przed wysłaniem emaila - python, django, email

Próbuję utworzyć formularz kontaktowy z python django, w tej chwili działa idealnie, problem polega na tym, że muszę czekać na wiadomość e-mail już wysłaną, aby uzyskać Httpresponse.

Czy jest jakiś sposób na zwrócenie Httpresponse najpierw, a następnie wysłać wiadomość e-mail?

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

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

Odpowiedzi:

1 dla odpowiedzi № 1

Zakładam, że chcesz, aby użytkownik zobaczył, że wiadomość e-mail została wysłana / żądanie zostało przetworzone natychmiast po kliknięciu przycisku „Wyślij”. Sugeruję użycie AJAX do osiągnięcia tego, co robisz.

Proces myślowy

Należy zauważyć, że prawdopodobnie chcesz pokaż ładujący gif / svg lub coś, co wskazuje, że wiadomość e-mail jest w trakcie wysyłania. Podczas wyświetlania gif ładowania, przejdź do sprawdzania poprawności formularza:

  • jeśli wszystko jest w porządku: przejdź do żądania AJAX, wyślij wiadomość e-mail i zwróć komunikat o powodzeniu / błędzie wskazujący, czy wiadomość e-mail została wysłana.

  • jeśli sprawdzanie poprawności nie powiodło się: wystarczy wyświetlić komunikaty o błędach


Jeśli jednak chcesz wyświetlić komunikat, na przykład „Dziękuję”, jest on mniej więcej taki:

Prawdopodobnie powinno to wyglądać mniej więcej w twoim JS (jeśli używasz 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
...
});

Rzeczywiste żądanie 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);
}
});

W Twoim 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."})