Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在返回python后运行命令_Python_Django_Asynchronous_Return - Fatal编程技术网

在返回python后运行命令

在返回python后运行命令,python,django,asynchronous,return,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)

我遇到了这个问题,我想返回一些东西,然后调用另一个函数(在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_发送电子邮件。我在这里尝试了几件事: -在另一个函数中调用new_user和send_email,但我需要返回某种类型的HttpResponse(因此我不能在不返回它的情况下调用new_user…),所以这不起作用 -尝试生成请求,但无法在生成后调用其他函数 -试过线程,也有类似的问题 -目前正在尝试asyncio,但我也遇到了一些问题,我还能做些什么吗?

您可以使用lamda

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

函数
返回后
s,不能在同一视图中执行额外代码。如果您的电子邮件必须在
返回后发送
,您可以将重定向
返回重定向(new\u view\u to\u send\u email)
从您的函数返回到发送电子邮件的新函数。

我知道实现此目的的唯一方法是在另一个线程中运行该函数。你说你尝试过,但没有成功,但没有提供一个你尝试过的例子。下面是一个应该有效的代码示例

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)
注意:您需要将该线程标记为一个
守护进程
,这样python就不会在关闭之前等待它加入。由于您正在将其旋转,以便在代码完成后运行,因此这是一个必要的步骤


另一种选择是使用某种类型的任务队列并将其发送到处理,您也可以说您正在尝试使用
asyncio
来处理它。在更大的应用程序中,这将是更好的选择。

与您现在所做的(即在返回之前调用
send\u email
)相比,有什么明显的区别?因此,在返回HttpResponse之前调用send_email的问题是,send email需要30秒到1分钟的时间来执行,并且总体上会减慢我的函数new_user的速度,用户等待new_user执行,因此等待一分钟以获得响应很烦人。。。总之,发送电子邮件的速度很慢。即使这是有效的,从
新用户返回
是否有意义?可能不是。是的,这就是问题所在,你不能在返回语句后执行代码,所以lamda不能工作!:(@rabiaasif,如果你回答chepner上面的问题会很有帮助。你希望通过这样做实现什么?你几乎肯定有一个。因此,如果我不返回HttpResponse,我的页面会崩溃(我正在使用django!)是的。您需要返回httpresponse或重定向到返回httpresponse的视图。在这种情况下,重定向功能应发送您的电子邮件,然后返回httpresponse。在阅读到问题来自系统发送电子邮件的时间后,排队是您的最佳选择。[链接](www.celeryproject.org)是一个很好的起点,虽然有些复杂,但很容易开始使用它。@rabiaasif,如果这是你问题的解决方案,那么你很可能有更大的问题。不幸的是,你从未回答过切普纳的有用问题。如果你回答过,我们可能能够帮助你解决这个更大的问题。我不知道明白为什么使用线程会是一个更大的问题吗?@rabiaasif,(a)视图函数可能不是使用多线程的正确位置,(b)chepner的问题直到现在都是有效的,没有得到回答。如果你问的是你的实际问题(发送电子邮件所需的时间),而不是你认为的解决方案(返回后发送电子邮件;请阅读)我们可能已经建议了一个更好的解决方案。例如,可以设置一个计划作业来发送排队的电子邮件。或者我们可以深入了解为什么您的邮件需要这么长时间才能发送。我也认为了解为什么发送电子邮件需要这么长时间会很好……或者继续使用任务队列,这是一个非常粗糙的解决方案。但是如果您只是在编写一个小脚本这应该很好…我明白你的意思,这不是我以前想到的…我正在使用smtplib、MIMEMultipart、MIMEText、MIMEMIMAGE这些用于python的工具,我除了附加一个图像和写一条短消息之外什么都不做,所以我不明白为什么这会很慢,或者我正在做什么来使它变慢。。。。