Запустите команду, после возврата, python - PullRequest
0 голосов
/ 04 сентября 2018

Я сталкивался с этой проблемой, когда хочу что-то вернуть и потом вызвать другую функцию (в python)

Вот мой текущий код:

def new_user(request):
'''Takes a request and enters it in the database IF that wallet id is not in the database! '''
data = request.body
if data != '':
    user_info = eval(data)
    if type(user_info) != type({}):
       ... more code here ...
                send_email(vCode)
                return HttpResponse(response)

Я хочу позвонить send_email после возврата ответа. Я попробовал несколько вещей здесь: -вызов new_user и send_email в другой функции, но мне нужно вернуть какой-то HttpResponse (поэтому я не могу вызвать new_user без его возврата ...), так что это не работает - попытался выдать запрос, не может вызвать другую функцию после yield пробовал нить, была похожая проблема -В настоящее время пытаюсь asyncio, но у меня возникают проблемы с этим, а есть ли что-нибудь еще, что я могу сделать?

Ответы [ 3 ]

0 голосов
/ 04 сентября 2018

После вашей функции Return вы не можете выполнить дополнительный код в том же виде. Если ваше электронное письмо должно быть отправлено после retunr, вы можете вернуть перенаправление return redirect(new_view_to_send_email) из вашей функции в новую функцию, которая отправляет электронное письмо.

0 голосов
/ 04 сентября 2018

Единственный способ, которым я знаю, для достижения этой цели - запустить функцию в другом потоке. Вы говорите, что пробовали это, но не имели успеха, но не приводили пример того, что вы пробовали. Ниже приведен пример кода, который должен работать

import threading
...
def new_user(request):
'''Takes a request and enters it in the database IF that wallet id is not in the database! '''
data = request.body
if data != '':
    user_info = eval(data)
    if type(user_info) != type({}):
       ... more code here ...
                task = threading.Thread(target=send_email, args=(vCode,))
                task.daemon = True
                task.start()
                return HttpResponse(response)

Примечание: вам нужно пометить этот поток как daemon, чтобы python не ждал, пока он не присоединится, прежде чем закрыться. Поскольку вы запускаете это после запуска кода, это необходимый шаг.

Другой вариант - использовать какую-то очередь задач и отправить ее на обработку, что, как вы говорите, вы пытаетесь сделать также с asyncio. В большем приложении это было бы лучшим вариантом.

0 голосов
/ 04 сентября 2018

Вы можете использовать лямду

lambda: return HttpResponse(response),
        send_email(vCode)
...