【问题标题】:trigger function after returning HttpResponse from django view从 django 视图返回 HttpResponse 后触发函数
【发布时间】:2012-03-18 17:57:37
【问题描述】:

我正在开发一个 django 网络服务器,另一台机器(具有已知 IP)可以将电子表格上传到我的网络服务器。 更新电子表格后,我想触发对电子表格的一些处理/验证/分析(这可能需要超过 5 分钟 --- 时间太长,其他服务器无法合理地等待响应)然后向另一台机器(IP已知)发送一个HttpResponse,表示数据处理完成。

我意识到在返回 HttpResponse 后不能执行 processing.data(),但从功能上讲,我希望代码看起来像这样:

# 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)"

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

我尝试使用django's request_finished signaling framework,但这不会在返回HttpResponse 后触发processing.spreadsheet() 方法。我尝试在 views.upload_spreadsheet 上使用装饰器,但遇到了同样的问题。

我有一种暗示,这可能与写 middlewarecustom class-based view 有关,我没有任何经验,所以我想我会向宇宙提出问题以寻求帮助.

感谢您的帮助!

【问题讨论】:

    标签: python django decorator django-signals django-middleware


    【解决方案1】:

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

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

    【讨论】:

    • 感谢您解释为什么这是必要的,克里斯托夫。根据你和jpic的解释,我想我多睡一会再去看看芹菜。
    【解决方案2】:

    您实施的问题在于,如果正在处理的电子表格数量等于工作人员的数量:您的网站将不再响应。

    你应该使用后台任务队列,基本上有2个进程:你的服务器和后台任务管理器。服务器应将电子表格的处理委托给后台任务管理器。当后台任务完成后,它应该以某种方式通知服务器。比如可以做model_with_spreadsheet.processed = datetime.datetime.now()。

    您应该使用 后台作业管理器,例如 django-ztask(非常简单的设置)、celery(非常强大,在您的情况下可能有点矫枉过正)甚至 uwsgi spooler(显然需要 uwsgi部署)。

    【讨论】:

    • 感谢您的快速回复。根据你和 christophe31 的回答,我想我会在多睡一会儿后去看看 celery。
    猜你喜欢
    • 2012-09-06
    • 1970-01-01
    • 2011-03-06
    • 2017-03-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多