當我在我的項目中對python源文件進行修改時,Django檢測到並重新啓動runserver本身。但是當我修改一個django模板時,我必須殺死runserver並重新啓動它:如何在模板更改時自動重啓runserver?如何使Django在模板更改時重新啓動runserver?
回答
該文件默認情況下會在每次請求時從磁盤讀取,因此不需要重新啓動任何內容。
有一個緩存模板加載器,但默認情況下它是禁用的。有關更多信息,請參見the documentation。
針對其中一個Python源文件運行touch
。
由於runserver
監視.py文件以進行更改,因此無法重新啓動模板(.html)中的更改。您可以通過使用touch
命令虛擬編輯任何.py文件來觸發此重新啓動,該命令刷新其修改日期並保留所有其他內容相同。
爲了增加knutin的回答,您所面臨的問題,通過FetchFromCacheMiddleware恰好造成了如此,所有你需要做的是在settings.py文件禁用它,如下所示:
settings.py:
MIDDLEWARE_CLASSES = (
...
#'django.middleware.cache.FetchFromCacheMiddleware',
...
)
我有一個類似的問題,但是我的模板需要運行一個django管理腳本才能更新它們。沒有簡單的方法讓django觀看其他文件類型,但是這裏有一個我使用的工作。
這是一個獨立的腳本,我現在用它來運行開發服務器:
#!/usr/bin/python
import time, subprocess, sys, os, re
from threading import Thread
run = True
def monitor():
while run:
os.system("./manage.py update_templates")
os.system("touch website/urls.py")
os.system("inotifywait -e modify,create,delete website/templates/*.html")
t = Thread(target=monitor)
t.start()
time.sleep(0.5)
args = ''
if len(sys.argv) > 1:
for i in range(1, len(sys.argv)):
args += sys.argv[i] +' '
print("./manage.py runserver %s" % args)
os.system("./manage.py runserver %s" % args)
run = False
t.join()
在以下假設這個腳本的工作原理:
- 使用python3
- 這個腳本是沿側放置manager.py
- manager.py可運行
- 該web應用程序被稱爲網站
- 該網站有一個名爲網站/文件urls.py
- 你正在使用的GNU/Linux,它支持inotify的
該文件將從磁盤,而無需重新啓動的runserver被讀取,只要確定你禁用了所有的緩存。
禁用緩存模板加載器
緩存模板加載器默認情況下不啓用,但你可能在你的生產設置中啓用此。確保緩存的模板加載器未啓用開發設置。 Django docs on the cached template loader
當您使用Django的緩存框架使用虛擬緩存框架
這可能會導致模板不重新加載。Django使用的默認框架是本地內存緩存,這意味着您必須顯式設置虛擬緩存來禁用緩存框架。 Django docs on dummy caching
您不需要重新啓動服務器來重新加載模板更改。
在生產中,你可以這樣做:
settings.py中,對於模板配置
- 刪除APP_DIRS設置
- 相反,該設置添加到選項:
'loaders': [
'django.template.loaders.filesystem.Loader',
'django.template.loaders.app_directories.Loader',
],
爲什麼這個作品:
默認情況下,DEBUG設置爲True(在開發模式下)。在這種模式下,Django不會緩存模板。但在生產模式下(即DEBUG = False),Django啓用模板緩存。因此,需要重新啓動服務器才能重新加載已編輯/已觸摸的模板。
注意:
請注意,通過在生產計算機上禁用模板緩存,您將爲每次通過的請求添加開銷。
- 1. 重新啓動的Django的runserver與文件更改
- 2. 灰塵模板更改時重新啓動節點
- 3. 必須手動重新啓動runserver models.py
- 4. django無法啓動runserver
- 5. shell腳本重新啓動屏幕內的django runserver
- 6. 如何在文件更改時自動重新加載Django?
- 7. 當Django代碼更改時是否需要重新啓動uWSGI?
- 8. 如何在文件更改時讓ASP.NET重新啓動?
- 9. 查看模式更改時活動重新啓動
- 10. 活動重新啓動時,電話查看模式更改
- 11. 如何在使用Django時處理dyno重新啓動?
- 12. 如何重新生成Django模板?
- 13. 使用Django我如何自動更新模板上的信息
- 14. 如何在django runserver啓動一個線程?
- 15. 看起來像我做fs.writeFile()時,更改後的文件重新啓動nodemon。如何使它不重新啓動?
- 16. 如何在新應用更新時強制重新啓動AppStore
- 17. WordPress頁面模板在更新時更改回默認模板
- 18. Django模板:動態更改標籤?
- 19. 更改模板時TOTAL_FORMS = 0 - Django的
- 20. 如何使定時器重新啓動?
- 21. 更改字體重新啓動活動
- 22. Django從線程動態更新模板
- 23. 僅在方向更改時重新啓動活動
- 24. Eclipse活動在代碼更改時不重新啓動
- 25. 服務器重新啓動時模板重複列表項目
- 26. Django模板:優化模板的更新
- 27. 更改django模板路徑
- 28. Django在更改不屬於該項目的文件時重新啓動
- 29. 如何使用外鍵在django模板中重新組合
- 30. 如何在發生更新時重新啓動應用程序?
OP已經表示他編輯了一個Python源文件,所以我沒有看到'touch'會改變什麼。 – metakermit 2013-11-14 20:59:09
@ kermit666:不,他說他編輯了一個模板。模板不是Python源文件。 – 2013-11-14 21:01:56