2014-12-01 59 views
7

這是我在所有在mod_wsgi中運行Django 1.7的網站上遇到的問題。問題的關鍵在於,如果在本地開發時,我會在代碼庫中引入致命錯誤,然後再糾正它,代碼監視腳本不會檢測到更正。使用mod-wsgi上的Django 1.7代碼更改監控故障

我使用Graham Dumpleton's monitor.py script來檢測當我在本地開發(我使用Apache而不是Django開發服務器)開發時對代碼庫的更改。

它總是使用在Django < = 1.6的工作,但在Django 1.7我得到以下錯誤:

File "/home/me/.virtualenvs/myvirtualenv/lib/python2.7/site-packages/django/core/wsgi.py", line 14, in get_wsgi_application 
    django.setup() 
File "/home/me/virtualenvs/myvirtualenv/lib/python2.7/site-packages/django/__init__.py", line 21, in setup 
    apps.populate(settings.INSTALLED_APPS) 
File "/home/me/.virtualenvs/myvirtualenv/lib/python2.7/site-packages/django/apps/registry.py", line 78, in populate 
    raise RuntimeError("populate() isn't reentrant") 
RuntimeError: populate() isn't reentrant 

惱人的事情是,如果我改正錯誤,monitor.py不檢測更改,所以我必須重新啓動apache,或者觸摸另一個已經加載的文件(例如設置文件)。

我認爲這是因爲「重裝代碼只監視導入的文件(又名sys.modules)」(source)。所以,因爲不正確的文件沒有被成功導入,monitor.py不知道重新啓動進程。

+0

這與python交互式解釋程序無法完全重新加載的方式類似。無論如何,內存中都有一個代碼副本,在許多情況下,刪除'.pyc/.pyo'文件不起作用。我們通過在所有文件上放置一個觀察器並在更改時重新加載apache入口點('wsgi')來修復此錯誤。這有點滯後,您可以將其關閉以進行生產。 – kunl 2015-10-26 14:02:31

+0

使用uwsgi時發生了類似的事情。然後我開始使用need-app = true。這使uwsgi放棄應用程序,因爲它沒有正確加載。所以一旦你開發新的改變,它會起作用。也許你可以找到類似的東西。 – 2015-11-17 17:40:22

+1

我已經結束了切換到Django開發服務器進行本地開發。除非你有一個非常好的理由,否則我認爲這比使用Apache和mod_wsgi進行本地Django開發更好。 – seddonym 2016-02-05 10:13:26

回答

0

我不確定你的部署過程是什麼,也不知道你的生產操作系統,但在Linux/Ubuntu世界中有一個叫做pyclean的操作系統命令。在我的Django/Python部署腳本(通常通過結構)期間,我發出命令「pyclean」。在項目根目錄中。該腳本以遞歸方式刪除當前文件夾中開始的所有.pyc文件。我希望這有幫助。