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

12 投票
7 回答
10384 浏览
提问于 2025-04-15 12:40

我想在渲染完视图之后做一些事情,使用的是

return render_to_response()

信号是唯一的方法吗?我需要写一个自定义信号,还是说request_finished已经提供了足够的信息?基本上,我需要知道渲染了哪个页面,然后根据这个页面做一些操作。

谢谢。

评论更新:我不想拖慢页面的渲染,所以我想先渲染页面,然后再执行这个操作。

7 个回答

5

如果你有一个需要很长时间才能完成的任务,你有两个简单的选择。

  1. 在发送响应页面之前,先启动一个子进程。

  2. 创建一个“后台服务守护进程”,然后把工作请求交给它。

这些都不在Django框架内。你可以使用subprocess或者其他一些进程间通信的方法来和另一个进程进行交流。

5

一种常见的方法是使用消息队列。你把一个消息放到队列里,然后工作线程(或者进程等)会从队列中取出消息,完成工作,这个过程是在你的视图完成之后进行的。

比如,Google的App Engine有一个任务队列的API,详细信息可以查看这里,而亚马逊则提供了简单队列服务,相关信息可以在这里找到。

我快速搜索了一下,没有找到任何看起来像是公认标准的Django插件。

如果想要简单粗暴地模拟这种功能,可以把“消息”放到数据库表里,然后设置一个定时任务,定期检查这个表来执行工作。

12

你可以创建一个单独的线程,让它去执行某个操作。

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的响应并结束了最初的线程。例如,它可以在不影响响应速度的情况下发送一封邮件。

撰写回答