Django开发中每请求自动重载?
可以让Django应用在每次请求时都重新加载吗?
这在开发过程中非常有用。Ruby on Rails 就是这样做的。
- 使用runserver命令可以重新加载,但速度比较慢,有时候为了让某些更改生效,还得手动停止再启动一次。(比如在管理后台的更改。)
- 在Linux上,mod_wsgi可以通过修改*.wsgi文件来自动重新加载。在Windows上则需要使用一个观察者/重新加载的脚本,这样做也比较慢。
- 我没有尝试过mod_python或fastcgi,它们能做到这一点吗?
这样做的原因是,当我们修改脚本时,希望这些更改能立即生效。
1 个回答
1
当然,重新加载会很慢,因为它需要重新加载所有的应用程序代码,而不仅仅是一个文件。Django和PHP不一样,所以别指望它们的工作方式相同。
如果你真的想让Django在每次请求时都重新加载,那就使用CGI和CGI/WSGI桥接。不过,这样做仍然会很慢,因为CGI本身会增加额外的负担。
使用Apache/mod_wsgi的方法,通过代码监控来实现,这在UNIX的守护进程模式下或者在Windows上是最好的折中方案。也就是说,它每秒检查一次应用程序中是否有代码文件被修改,只有在发现变化后才会重启进程。运行服务器本身也使用这种每秒检查的方法。
使用这种检查的方法会引入一个一秒的时间窗口,在这段时间内你可能会发出请求,而代码重新加载的需求还没有被检测到。不过,大多数人从保存文件到在浏览器中重新加载并不会那么快,所以通常不会注意到这个问题。
在Apache/mod_wsgi 3.0中,有一些机制可以让你实现一种替代的代码重新加载方式,这样可以在请求开始时就检查修改过的代码,从而消除这个时间窗口,但这会影响每个请求的性能。相比之下,轮询方法是在后台运行的,通常不会对请求的性能造成影响。
即使在当前版本的Apache/mod_wsgi中,你也可以通过使用嵌入模式并将Apache的MaxRequestsPerChild设置为1来实现相同的效果,但这也会影响静态文件的服务性能。
总之,强行在每次请求时重新加载并不是最好的方法,肯定无法消除使用像Django这样庞大的Python web应用所带来的加载延迟。