返回后,运行命令python

时间:2018-09-04 18:51:16

标签: python django asynchronous return

我遇到了这个问题,我想返回一些东西,然后再调用另一个函数(在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 ...),所以这不起作用 -尝试产生请求,在产生之后无法调用其他函数 -尝试线程,有类似的问题 -目前正在尝试asyncio,但与此同时我也遇到了问题,我还能做些其他事情吗?

3 个答案:

答案 0 :(得分:1)

我知道实现此目标的唯一方法是在另一个线程中运行该函数。您说您已经尝试过,但是没有成功,但是没有提供您尝试过的例子。以下是应正常工作的代码示例

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。在较大的应用程序中,这将是更好的选择。

答案 1 :(得分:0)

功能Return之后,您将无法在同一视图中执行额外的代码。如果您的电子邮件必须在retunr之后发送,则可以将重定向return redirect(new_view_to_send_email)从您的函数返回到发送电子邮件的新函数。

答案 2 :(得分:-2)

您可以使用lamda

UINavigationController