gpt4 book ai didi

django - 在继续完成与请求相关的任务之前,如何让 django 给出 HTTP 响应?

转载 作者:行者123 更新时间:2023-12-04 13:54:22 24 4
gpt4 key购买 nike

在我的 django 活塞 API 中,我想在调用另一个需要很长时间的函数之前向客户端产生/返回一个 http 响应。如何使产量给出包含所需 JSON 而不是与创建生成器对象相关的字符串的 HTTP 响应?

我的活塞处理程序方法如下所示:

def create(self, request):
data = request.data

*other operations......................*

incident.save()
response = rc.CREATED
response.content = {"id":str(incident.id)}
yield response
manage_incident(incident)

而不是我想要的回应,比如:
   {"id":"13"}

客户端得到一个这样的字符串:
 "<generator object create at 0x102c50050>"

编辑:

我意识到使用 yield 是解决这个问题的错误方法,本质上我想要实现的是客户端在服务器转移到 manage_incident() 的耗时函数之前立即收到响应

最佳答案

这与生成器或产生没有任何关系,但我使用以下代码和装饰器让事情在后台运行,同时立即向客户端返回 HTTP 响应。

用法:

@postpone
def long_process():
do things...

def some_view(request):
long_process()
return HttpResponse(...)

这是使其工作的代码:
import atexit
import Queue
import threading

from django.core.mail import mail_admins


def _worker():
while True:
func, args, kwargs = _queue.get()
try:
func(*args, **kwargs)
except:
import traceback
details = traceback.format_exc()
mail_admins('Background process exception', details)
finally:
_queue.task_done() # so we can join at exit

def postpone(func):
def decorator(*args, **kwargs):
_queue.put((func, args, kwargs))
return decorator

_queue = Queue.Queue()
_thread = threading.Thread(target=_worker)
_thread.daemon = True
_thread.start()

def _cleanup():
_queue.join() # so we don't exit too soon

atexit.register(_cleanup)

关于django - 在继续完成与请求相关的任务之前,如何让 django 给出 HTTP 响应?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6614194/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com