Python 渲染视图后如何执行某些操作?(Django)

Python 渲染视图后如何执行某些操作?(Django),python,django,Python,Django,在使用渲染视图之后,我想执行一些操作 return render_to_response() 信号是唯一的方法吗?我需要写一个自定义信号还是请求_finished给我足够的信息?基本上,我需要知道呈现的是什么页面,然后执行相应的操作 谢谢 从注释更新:我不想延迟页面的呈现,因此我希望先呈现页面,然后执行操作。在“呈现到响应”中,您将传递要显示的html页面。另一个页面需要发送一个帖子(通过Javascript或其他方式)来触发视图中的正确函数,然后该视图调用要显示的正确下一个页面。如果您有一个

在使用渲染视图之后,我想执行一些操作

return render_to_response()
信号是唯一的方法吗?我需要写一个自定义信号还是请求_finished给我足够的信息?基本上,我需要知道呈现的是什么页面,然后执行相应的操作

谢谢


从注释更新:我不想延迟页面的呈现,因此我希望先呈现页面,然后执行操作。

在“呈现到响应”中,您将传递要显示的html页面。另一个页面需要发送一个帖子(通过Javascript或其他方式)来触发视图中的正确函数,然后该视图调用要显示的正确下一个页面。

如果您有一个长期运行的流程,您有两个简单的选择

t = threading.Thread(target=do_my_action, args=[my_argument])
# We want the program to wait on this thread before shutting down.
t.setDaemon(False)
t.start()
  • 在发送响应页面之前生成子流程

  • 创建一个“后台服务守护程序”,并将工作请求传递给它


  • 这一切都在Django之外。您可以使用IPC或其他IPC方法与其他进程通信。

    一种常见的方法是使用消息队列。您在队列上放置了一条消息,工作线程(或进程等)使用该队列并在视图完成后执行工作

    googleappengine有任务队列api,amazon有简单的队列服务

    快速搜索没有发现任何django pluggables看起来像是公认的标准


    模拟该功能的一种快速而肮脏的方法是将“消息”放在数据库表中,并让cron作业定期检查表以执行该工作。

    Django的HttpResponse对象在其构造函数中接受迭代器:

    所以你可以这样做:

    def myiter():
        yield "my content"
        enqueue_some_task()
        return
    
    def myview(request):
        return HttpResponse(myiter())
    

    迭代器的正常使用是发送大数据而不将其全部读入内存。例如,从文件中读取块并适当地生成。我从未以这种方式使用过它,但它似乎应该可以工作。

    我最喜欢的解决方案:一个单独的过程,处理后台任务,通常是索引和发送通知邮件等。然后,在视图渲染期间,将事件发送到事件处理系统(我不知道Django是否有一个内置的,但无论如何你都需要一个,所以你应该有一个)然后,偶数系统将一条消息放入一个消息队列(除非你有多台机器或多个后台进程,否则写这条消息很简单)来执行所讨论的任务。

    你生成了一个单独的线程并让它执行操作

    t = threading.Thread(target=do_my_action, args=[my_argument])
    # We want the program to wait on this thread before shutting down.
    t.setDaemon(False)
    t.start()
    

    这将导致“do_my_action(my_argument)”在第二个线程中执行,即使在您发送Django响应并终止初始线程后,该线程仍将继续工作。例如,它可以发送电子邮件而不会延迟响应。

    也许我不理解您的问题。但为什么不做一些简单的事情,例如:

    try:
        return render_to_response()
    finally:
        do_what_needs_to_be_done()
    

    这似乎有点倒退。你知道你要渲染哪个页面。只需执行该操作。为什么你不能简单地在view函数中插入额外的操作?请提供一些提示,说明你正在尝试执行的操作。我不想延迟页面的渲染,所以我想先渲染页面,然后执行以下操作action@rick:请不要评论您自己的问题,请用其他事实更新您的问题。是的,这样做可以,但我想知道是否有一种方法可以仅在服务器端完成此操作我不确定这是否真的可能:/n这绝对不能在服务器端完成。服务器不知道客户端正在做什么,因此它永远不会知道页面已完成ed渲染。当然,一篇简单的帖子就能解决这个问题。同意——我会使用某种IPC使这个模块化和web服务器中立。你可能不想在发送响应后破解Django内部的东西。+1比(希望)更有效轻量级IPC消息。返回后,视图将正确呈现?无论finally部分中发生了什么?如果是,这正是我需要的!它似乎不起作用。呈现将在finally中的代码运行时暂停。当存在finally子句时,函数的返回仅在finally中的代码已执行,因此无法按预期工作。不幸的是,这会使页面在完全加载后仍在客户端加载,因为服务器在最终结果产生之前不会关闭连接。我尝试了此实现。显然,启动的第二个线程终止,即使其任务为n尚未完成。在我的例子中,它正在更新几个数据库条目