복붙노트

[PYTHON] 장고 애플리케이션이 개발 서버에서 실행 중인지 여부를 어떻게 알 수 있습니까?

PYTHON

장고 애플리케이션이 개발 서버에서 실행 중인지 여부를 어떻게 알 수 있습니까?

내 응용 프로그램이 개발 서버에서 실행되고 있는지 여부를 어떻게 확인할 수 있습니까? 나는 settings.DEBUG의 가치를 확인할 수 있고 DEBUG가 True이면 개발 서버에서 실행되고 있다고 가정하지만, 규칙에 의존하는 것보다 확실히 알고 싶습니다.

해결법

  1. ==============================

    1.

    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 정보 섹션에서 흥미로운 내용을 검색했습니다. 따라서 Nate의 아이디어를 뒷받침 할 수있는 답을 편집하고 있습니다.

  2. ==============================

    2.표준 dev 서버와 프로덕션을 구별하기 위해 settings.py에 다음을 넣었습니다.

    표준 dev 서버와 프로덕션을 구별하기 위해 settings.py에 다음을 넣었습니다.

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

    그러나 이것은 또한 국제 대회에 의존합니다.

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

  3. ==============================

    3.일반적으로 environment라는 변수를 설정하고 "DEVELOPMENT", "STAGING"또는 "PRODUCTION"으로 설정합니다. 설정 파일에서 기본 논리를 추가하여 환경에 따라 사용중인 설정을 변경할 수 있습니다.

    일반적으로 environment라는 변수를 설정하고 "DEVELOPMENT", "STAGING"또는 "PRODUCTION"으로 설정합니다. 설정 파일에서 기본 논리를 추가하여 환경에 따라 사용중인 설정을 변경할 수 있습니다.

    편집 : 또한, 당신은 단순히 기본 설정을 무시하는 다른 settings.py 파일을 포함하는이 논리를 사용할 수 있습니다. 예 :

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

    4.일반적으로 다음과 같이 작동합니다.

    일반적으로 다음과 같이 작동합니다.

    import sys
    
    if 'runserver' in sys.argv:
        # you use runserver
    
  5. ==============================

    5.설정에 의존 .DEBUG는 가끔 장고 코드베이스에서도 사용되는 가장 우아한 방식의 AFAICS입니다.

    설정에 의존 .DEBUG는 가끔 장고 코드베이스에서도 사용되는 가장 우아한 방식의 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에서 파일 경로를 검사하는 사용자가 환경 변수를 사용하는 것보다 훨씬 쉽습니다.

  6. ==============================

    6.지금 당장이 문제를 보았고 Aryeh Leib Taurog와 비슷한 해결책을 작성했습니다. 내 주요 차이점은 서버를 실행할 때 프로덕션 환경과 개발 환경을 구별하고 싶지만 내 앱 (DJANGO_SETTINGS_MODULE = settings python [스크립트]처럼 실행)에 대한 일회용 스크립트를 실행할 때도 마찬가지입니다. 이 경우 간단히 argv [1] == runserver로 충분하지 않은지 여부를 조사합니다. 그래서 내가 생각한 것은 devserver를 실행할 때, 그리고 스크립트를 실행할 때 settings.py에서 그 인수를 찾으면 추가적인 명령 줄 인수를 전달하는 것입니다. 코드는 다음과 같습니다.

    지금 당장이 문제를 보았고 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 = 설정 파이썬 [myscript] - 개발 중

    전달하는 추가 인수가 django와 충돌하지 않도록하십시오 (사실은 인수의 일부로 내 응용 프로그램의 이름을 사용합니다). 내 서버와 스크립트가 prod 나 dev로 작동 할 때 정확히 제어 할 수 있기 때문에 이것이 꽤 괜찮은 것 같아요. 내 자신이 아닌 다른 사람의 컨벤션에 의존하지 않습니다.

    편집 : 당신이 인식 할 수없는 옵션을 전달하면 manage.py 불평, 그래서 뭔가를 같이 settings.py 코드를 변경해야합니다.

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

    이 방법이 효과적 일지라도, 나는 이것이 가장 우아한 해결책이 아니라는 것을 알고 있습니다 ...

  7. ==============================

    7.런타임 환경에 따라 설정 파일을 자동으로 전환하려는 경우 당신은 단지 환경과 다른 것을 사용할 수 있습니다.

    런타임 환경에 따라 설정 파일을 자동으로 전환하려는 경우 당신은 단지 환경과 다른 것을 사용할 수 있습니다.

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

    8.settings.DEBUG는 True 일 수 있으며 Apache 또는 일부 다른 비 개발 서버에서 실행될 수 있습니다. 여전히 실행됩니다. 내가 말할 수있는 한, 런타임 환경에서는 pid를 검사하고 OS 정보를 제공하는 pid와 비교해 볼 길이 없다.

    settings.DEBUG는 True 일 수 있으며 Apache 또는 일부 다른 비 개발 서버에서 실행될 수 있습니다. 여전히 실행됩니다. 내가 말할 수있는 한, 런타임 환경에서는 pid를 검사하고 OS 정보를 제공하는 pid와 비교해 볼 길이 없다.

  9. ==============================

    9.개발 환경과 배포 환경의 차이점 중 하나는 실행중인 서버입니다. 정확히 무엇이 다른가는 개발자 및 배포 환경에 따라 다릅니다.

    개발 환경과 배포 환경의 차이점 중 하나는 실행중인 서버입니다. 정확히 무엇이 다른가는 개발자 및 배포 환경에 따라 다릅니다.

    자신의 dev을 알고 배포 환경을 알고 있으면 HTTP 요청 변수를 사용하여 둘 사이를 구별 할 수 있습니다. request.META.HTTP_HOST, request.META.SERVER_NAME 및 request.META.SERVER_PORT와 같은 요청 변수를 살펴보고 두 환경에서이를 비교하십시오.

    뭔가 다른 점을 분명히하고 개발 환경을 감지하는 데 사용할 수 있습니다. settings.py에서 테스트를 수행하고 다른 곳에서 사용할 수있는 변수를 설정하십시오.

  10. ==============================

    10.나는 사용한다:

    나는 사용한다:

    DEV_SERVERS = [
        'mymachine.local',
    ]
    
    DEVELOPMENT = platform.node() in DEV_SERVERS
    

    .node ()가 귀하의 컴퓨터에서 반환하는 것에주의를 기울여야합니다. 민감한 개발 정보를 우연히 노출시키지 않도록 기본값이 개발되지 않는 것이 중요합니다.

    컴퓨터를 고유하게 식별하는보다 복잡한 방법을 살펴볼 수도 있습니다.

  11. ==============================

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

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

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

    (나의 유스 케이스는 테스트 서버를 실행할 때 장고 네이티브 인증을 자동으로 활성화하는 것이다. 개발 서버에서도 아파치에서 실행될 때 현재 프로젝트에 대한 모든 인증은 Kerberos를 통해 처리된다)

  12. ==============================

    12.WSGI (mod_wsgi, gunicorn, 웨이트리스 등) 대 manage.py (runserver, 테스트, 마이그레이션 등) 또는 다른 어떤 것에서 실행 중인지 확인할 수 있습니다.

    WSGI (mod_wsgi, gunicorn, 웨이트리스 등) 대 manage.py (runserver, 테스트, 마이그레이션 등) 또는 다른 어떤 것에서 실행 중인지 확인할 수 있습니다.

    import sys
    WSGI = 'django.core.wsgi' in sys.modules
    
  13. from https://stackoverflow.com/questions/1291755/how-can-i-tell-whether-my-django-application-is-running-on-development-server-or by cc-by-sa and MIT license