내 Django 애플리케이션이 개발 서버에서 실행되고 있는지 여부를 어떻게 알 수 있나요?

StackOverflow https://stackoverflow.com/questions/1291755

  •  18-09-2019
  •  | 
  •  

문제

내 애플리케이션이 개발 서버에서 실행되고 있는지 여부를 어떻게 확인할 수 있나요?가치를 확인할 수 있을 것 같아요 settings.DEBUG 그리고 가정한다면 DEBUG ~이다 True 그런 다음 개발 서버에서 실행되지만 규칙에 의존하는 것보다 확실히 알고 싶습니다.

도움이 되었습니까?

해결책

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 메타에 설정 될 수 있고 이름이 지정된 모듈의 클래스가있을 수 있습니다. django.core.servers.basehttp 다른 서버 환경에 대한 우연의 일치로, 그러나 이것이 당신을 덮을 수 있기를 바랍니다.

그건 그렇고, 나는 개발 서버에서 실행 중에 구동적으로 유효하지 않은 템플릿을 만들어 이것을 발견하고 흥미로운 것들을 검색했습니다. Traceback 그리고 Request information 섹션이므로 Nate의 아이디어로 확증하기 위해 답을 편집하고 있습니다.

다른 팁

표준 개발자 서버와 프로덕션을 구별하기 위해 다음을 설정에 넣습니다.

import sys
RUNNING_DEVSERVER = (len(sys.argv) > 1 and sys.argv[1] == 'runserver')

그러나 이것은 또한 컨벤션에 의존합니다.

(Daniel Magnusson의 의견에 따라 수정)

일반적으로 호출 된 변수를 설정했습니다 environment "개발", "준비"또는 "생산"으로 설정하십시오. 설정 파일 내에서 환경에 따라 사용중인 설정을 변경하기 위해 기본 논리를 추가 할 수 있습니다.

편집하다: 또한이 논리를 사용하여 다른 것을 포함시킬 수 있습니다. settings.py 기본 설정을 무시하는 파일. 예를 들어:

if environment == "DEBUG":
    from debugsettings import *

일반적으로 이것은 작동합니다.

import sys

if 'runserver' in sys.argv:
    # you use runserver

settings.DEBUG에 의존하는 것은 때때로 Django 코드 기반에서도 사용되기 때문에 AFAICS에서 가장 우아한 방법입니다.

당신이 정말로 원하는 것은 프로젝트를 프로덕션 서버에 업로드할 때마다 수동으로 업데이트할 필요 없이 해당 플래그를 자동으로 설정하는 방법이라고 생각합니다.

이를 위해 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에서 서비스를 제공하는 사람으로서 파일 경로를 확인하는 것은 환경 변수를 사용하는 것보다 훨씬 쉬웠습니다.

나는 지금이 문제를 발견했고 Aryeh Leib Taurog와 비슷한 솔루션을 작성하게되었습니다. 내 주요 차이점은 서버를 실행할 때 생산 환경과 개발 환경을 구별하고 싶지만 앱에 대한 일회성 스크립트를 실행할 때 (DJANGO_SETTINGS_MODULE = SETTINGS PYSYN [The Script])를 실행할 때도드립니다. 이 경우 ArgV [1] == Runserver로 충분하지 않은지 간단히 살펴보십시오. 그래서 제가 생각해 낸 것은 DevServer를 실행할 때와 스크립트를 실행할 때 추가 명령 줄 인수를 전달하는 것입니다. 따라서 코드는 다음과 같습니다.

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 = settings python [myscript]-개발

당신이 통과하는 추가 논쟁이 django와 충돌하지 않도록하십시오 (실제로는 내 앱의 이름을 논쟁의 일부로 사용합니다). 내 서버와 스크립트가 Prod 또는 Dev로 행동 할 때 정확히 제어 할 수 있기 때문에 이것이 꽤 괜찮다고 생각합니다. 나는 내 자신 이외의 다른 사람의 컨벤션에 의존하지 않습니다.

편집 : manage.py는 인식 할 수없는 옵션을 전달하는 경우 불만을 제기하므로 Settings.py에서 코드를 변경해야합니다.

if sys.argv[0] == 'manage.py' or '--in-development' in sys.argv:
    # ...
    pass

이것이 효과가 있지만, 그것이 가장 우아한 솔루션이 아니라는 것을 알고 있습니다 ...

런타임 환경에 자동으로 설정 파일을 전환하려면 환경에서 다른 것을 사용할 수 있습니다.

from os import environ
if environ.get('_', ''): 
    print "This is dev - not Apache mod_wsgi"         

Settings.debug는 Apache 또는 다른 비 개발 서버에서 사실이며 실행될 수 있습니다. 여전히 실행됩니다. 내가 알 수있는 한, 런타임 환경에는 PID를 검사하고 OS의 PID와 비교 하여이 정보를 제공 할 수있는 것은 없습니다.

개발과 배포 환경의 한 가지 차이점은 실행중인 서버가 될 것입니다. 정확히 다른 점은 개발 및 배포 환경에 따라 다릅니다.

HTTP 요청 변수를 사용하여 두 가지를 구별하는 데 사용될 수 있습니다. 보다 요청 변수 처럼 request.META.HTTP_HOST, request.META.SERVER_NAME 그리고 request.META.SERVER_PORT 그리고 두 환경에서 비교하십시오.

나는 그것이 다른 분명한 것을 찾을 것이라고 확신하며, 당신의 개발 환경을 감지하는 데 사용될 수 있습니다. 테스트를 수행하십시오 settings.py 다른 곳에서 사용할 수있는 변수를 설정하십시오.

나는 사용한다:

DEV_SERVERS = [
    'mymachine.local',
]

DEVELOPMENT = platform.node() in DEV_SERVERS

반환 내용에주의를 기울여야합니다 .node() 당신의 기계에서. 기본적으로 민감한 개발 정보를 노출시키지 않도록 기본값이 개발되지 않는 것이 중요합니다.

당신은 또한 조사 할 수 있습니다 컴퓨터를 고유하게 식별하는 더 복잡한 방법.

Aryeh의 답변에서 영감을 얻은 제가 스스로 사용하기 위해 고안 한 트릭은 내 관리 스크립트의 이름을 찾는 것입니다. sys.argv[0]:

USING_DEV_SERVER = "pulpdist/manage_site.py" in sys.argv[0]

(내 유스 케이스는 테스트 서버를 실행할 때 Django 기본 인증을 자동으로 활성화하는 것입니다 - Apache에서 실행중인 개발 서버에서도 현재 프로젝트의 모든 인증은 Kerberos를 통해 처리됩니다).

당신은 당신이 아래로 달리는 지 여부를 결정할 수 있습니다 WSGI (mod_wsgi, gunicorn, 웨이트리스 등) Vs. 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")
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top