从django视图返回HttpResponse后触发函数

din*_*ino 6 python django decorator django-middleware django-signals

我正在开发一个django网络服务器,另一台机器(具有已知IP)可以将电子表格上传到我的网络服务器.之后的电子表格已经更新,我想触发电子表格上的一些处理/确认/分析(可坐>5分钟---过长其他服务器,以合理的等待响应),然后发送给其他机器(使用已知IP)HttpResponse指示数据处理已完成.

我意识到processing.data()在返回之后你无法做到HttpResponse,但在功能上我希望代码看起来像这样:

# processing.py
def spreadsheet(*args, **kwargs):
    print "[robot voice] processing spreadsheet........."
    views.finished_processing_spreadsheet()

# views.py
def upload_spreadsheet(request):
    print "save the spreadsheet somewhere"
    return HttpResponse("started processing spreadsheet")
    processing.data()

def finished_processing_spreadsheet():
    print "send good news to other server (with known IP)"
Run Code Online (Sandbox Code Playgroud)

我知道如何单独编写每个函数,但是如何processing.data() views.upload_spreadsheet返回响应有效地调用?

我尝试使用django的request_finished信令框架,但这不会processing.spreadsheet()在返回后触发该方法 HttpResponse.我尝试使用装饰器views.upload_spreadsheet同样的问题.

我有一个想法,这可能与编写中间件或可能是一个基于类自定义视图有关,我都没有任何经验,所以我想我会向宇宙提出一些问题寻求帮助.

谢谢你的帮助!

chr*_*e31 5

事实上,Django 有一个同步模型。如果要进行真正的异步处理,则需要一个消息队列。与 django 一起使用最多的是芹菜,它可能看起来有点“矫枉过正”,但这是一个很好的答案。

我们为什么需要这个?因为在 wsgi 应用程序中,apache 向可执行文件发出请求,并且可执行文件返回文本。只有一次当可执行文件完成执行时,apache 才知道请求的结束。