[英]How can I tell whether my Django application is running on development server or not?
我如何確定我的應用程序是否在開發服務器上運行? 我想我可以檢查settings.DEBUG
的值並假設DEBUG
是否為True
然后它在開發服務器上運行,但我寧願確定而不是依賴約定。
我在settings.py中添加以下內容以區分標准開發服務器和生產:
import sys
RUNNING_DEVSERVER = (len(sys.argv) > 1 and sys.argv[1] == 'runserver')
然而,這也依賴於慣例。
(根據Daniel Magnusson的評論修改)
server = request.META.get('wsgi.file_wrapper', None)
if server is not None and server.__module__ == 'django.core.servers.basehttp':
print('inside dev')
當然, wsgi.file_wrapper
可能在META上設置,並且在另一個服務器環境中具有來自名為django.core.servers.basehttp
的模塊的類,但是我希望這將覆蓋您。
順便說一句,我發現這是通過在開發服務器上運行時創建一個無效的模板,並在Traceback
和Request information
部分搜索有趣的東西,所以我只是編輯我的答案來證實Nate的想法。
通常我設置一個名為environment
的變量並將其設置為“DEVELOPMENT”,“STAGING”或“PRODUCTION”。 在設置文件中,我可以添加基本邏輯,以根據環境更改正在使用的設置。
編輯:此外,您可以簡單地使用此邏輯來包含覆蓋基本設置的不同settings.py
文件。 例如:
if environment == "DEBUG":
from debugsettings import *
通常這有效:
import sys
if 'runserver' in sys.argv:
# you use runserver
依賴settings.DEBUG是AFAICS最優雅的方式,因為它偶爾也會在Django代碼庫中使用。
我想你真正想要的是一種自動設置該標志的方法,而無需在每次將項目上傳到生產服務器時手動更新它。
為此,我檢查settings.py的路徑(在settings.py中)以確定項目運行的服務器:
if __file__ == "path to settings.py in my development machine":
DEBUG = True
elif __file__ in [paths of production servers]:
DEBUG = False
else:
raise WhereTheHellIsThisServedException()
請注意,您可能也更喜歡使用@Soviut建議的環境變量進行檢查。 但是,正如在Windows上開發並在Linux上進行服務檢查文件路徑的人要比使用環境變量更容易。
如果您想根據運行時環境自動切換設置文件,您可以使用環境不同的內容,例如
from os import environ
if environ.get('_', ''):
print "This is dev - not Apache mod_wsgi"
我剛才遇到了這個問題,最后寫了一個類似於Aryeh Leib Taurog的解決方案。 我的主要區別在於我想在運行服務器時區分生產環境和開發環境,還要為我的應用程序運行一些一次性腳本(我的運行方式如DJANGO_SETTINGS_MODULE = settings python [腳本])。 在這種情況下,只需查看argv [1] == runserver是否足夠。 所以我想到的是在運行devserver時傳遞一個額外的命令行參數,當我運行我的腳本時,只需在settings.py中查找該參數。 所以代碼看起來像這樣:
if '--in-development' in sys.argv:
## YES! we're in dev
pass
else:
## Nope, this is prod
pass
然后,運行django服務器成為
python manage.py runserver [你想要的任何選項] - 開發中
並運行我的腳本就像
DJANGO_SETTINGS_MODULE =設置python [myscript] - 開發
只要確保你傳遞的額外參數不會與任何django沖突(實際上我使用我的應用程序的名稱作為參數的一部分)。 我認為這是相當不錯的,因為它讓我可以准確控制我的服務器和腳本何時表現為prod或dev,並且我不依賴於任何其他人的約定,而不是我自己的約定。
編輯:manage.py抱怨如果你傳遞無法識別的選項,所以你需要更改settings.py中的代碼類似於
if sys.argv[0] == 'manage.py' or '--in-development' in sys.argv:
# ...
pass
雖然這有效,但我認識到這不是最優雅的解決方案......
我用:
DEV_SERVERS = [
'mymachine.local',
]
DEVELOPMENT = platform.node() in DEV_SERVERS
這需要注意機器上.node()
返回的內容。 默認情況下,非開發非常重要,這樣您就不會意外地暴露敏感的開發信息。
您還可以研究更復雜的方法來唯一識別計算機 。
settings.DEBUG可以是True並在Apache或其他非開發服務器下運行。 它仍然會運行。 據我所知,在運行時環境中沒有任何內容可以檢查pid並與操作系統中的pids進行比較,這些pids將為您提供此信息。
開發和部署環境之間的一個區別將是它正在運行的服務器。 具體的不同取決於您的開發和部署環境。
了解您自己的開發和部署環境后,可以使用HTTP請求變量來區分這兩者。 查看request.META.HTTP_HOST
, request.META.SERVER_NAME
和request.META.SERVER_PORT
等請求變量 ,並在兩個環境中對它們進行比較。
我打賭你會找到一些非常明顯的東西,可以用來檢測你的開發環境。 在settings.py
進行測試並設置一個可以在別處使用的變量。
在Aryeh的回答的啟發下,我為自己設計的技巧是在sys.argv[0]
查找管理腳本的名稱:
USING_DEV_SERVER = "pulpdist/manage_site.py" in sys.argv[0]
(我的用例是在運行測試服務器時自動啟用Django本機身份驗證 - 在Apache下運行時,即使在開發服務器上,我當前項目的所有身份驗證都通過Kerberos處理)
您可以確定您是在WSGI
(mod_wsgi,gunicorn,女服務員等)與manage.py
(runserver,test,migrate等)或其他任何內容下運行:
import sys
WSGI = 'django.core.wsgi' in sys.modules
你可以查看request.META["SERVER_SOFTWARE"]
值:
dev_servers = ["WSGIServer", "Werkzeug"]
if any(server in request.META["SERVER_SOFTWARE"] for server in dev_servers):
print("is local")
很簡單,您可以檢查您在服務器上工作的路徑。 就像是:
import os
SERVER = True if os.path.exists('/var/www/your_project') else False
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.