簡體   English   中英

我如何判斷我的 Django 應用程序是否在開發服務器上運行?

[英]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的模塊的類,但是我希望這將覆蓋您。

順便說一句,我發現這是通過在開發服務器上運行時創建一個無效的模板,並在TracebackRequest 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_HOSTrequest.META.SERVER_NAMErequest.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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM