[PYTHON] 장고 애플리케이션이 개발 서버에서 실행 중인지 여부를 어떻게 알 수 있습니까?
PYTHON장고 애플리케이션이 개발 서버에서 실행 중인지 여부를 어떻게 알 수 있습니까?
내 응용 프로그램이 개발 서버에서 실행되고 있는지 여부를 어떻게 확인할 수 있습니까? 나는 settings.DEBUG의 가치를 확인할 수 있고 DEBUG가 True이면 개발 서버에서 실행되고 있다고 가정하지만, 규칙에 의존하는 것보다 확실히 알고 싶습니다.
해결법
-
==============================
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.표준 dev 서버와 프로덕션을 구별하기 위해 settings.py에 다음을 넣었습니다.
표준 dev 서버와 프로덕션을 구별하기 위해 settings.py에 다음을 넣었습니다.
import sys RUNNING_DEVSERVER = (len(sys.argv) > 1 and sys.argv[1] == 'runserver')
그러나 이것은 또한 국제 대회에 의존합니다.
(Daniel Magnusson의 의견에 따라 수정 됨)
-
==============================
3.일반적으로 environment라는 변수를 설정하고 "DEVELOPMENT", "STAGING"또는 "PRODUCTION"으로 설정합니다. 설정 파일에서 기본 논리를 추가하여 환경에 따라 사용중인 설정을 변경할 수 있습니다.
일반적으로 environment라는 변수를 설정하고 "DEVELOPMENT", "STAGING"또는 "PRODUCTION"으로 설정합니다. 설정 파일에서 기본 논리를 추가하여 환경에 따라 사용중인 설정을 변경할 수 있습니다.
편집 : 또한, 당신은 단순히 기본 설정을 무시하는 다른 settings.py 파일을 포함하는이 논리를 사용할 수 있습니다. 예 :
if environment == "DEBUG": from debugsettings import *
-
==============================
4.일반적으로 다음과 같이 작동합니다.
일반적으로 다음과 같이 작동합니다.
import sys if 'runserver' in sys.argv: # you use runserver
-
==============================
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.지금 당장이 문제를 보았고 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.런타임 환경에 따라 설정 파일을 자동으로 전환하려는 경우 당신은 단지 환경과 다른 것을 사용할 수 있습니다.
런타임 환경에 따라 설정 파일을 자동으로 전환하려는 경우 당신은 단지 환경과 다른 것을 사용할 수 있습니다.
from os import environ if environ.get('_', ''): print "This is dev - not Apache mod_wsgi"
-
==============================
8.settings.DEBUG는 True 일 수 있으며 Apache 또는 일부 다른 비 개발 서버에서 실행될 수 있습니다. 여전히 실행됩니다. 내가 말할 수있는 한, 런타임 환경에서는 pid를 검사하고 OS 정보를 제공하는 pid와 비교해 볼 길이 없다.
settings.DEBUG는 True 일 수 있으며 Apache 또는 일부 다른 비 개발 서버에서 실행될 수 있습니다. 여전히 실행됩니다. 내가 말할 수있는 한, 런타임 환경에서는 pid를 검사하고 OS 정보를 제공하는 pid와 비교해 볼 길이 없다.
-
==============================
9.개발 환경과 배포 환경의 차이점 중 하나는 실행중인 서버입니다. 정확히 무엇이 다른가는 개발자 및 배포 환경에 따라 다릅니다.
개발 환경과 배포 환경의 차이점 중 하나는 실행중인 서버입니다. 정확히 무엇이 다른가는 개발자 및 배포 환경에 따라 다릅니다.
자신의 dev을 알고 배포 환경을 알고 있으면 HTTP 요청 변수를 사용하여 둘 사이를 구별 할 수 있습니다. request.META.HTTP_HOST, request.META.SERVER_NAME 및 request.META.SERVER_PORT와 같은 요청 변수를 살펴보고 두 환경에서이를 비교하십시오.
뭔가 다른 점을 분명히하고 개발 환경을 감지하는 데 사용할 수 있습니다. settings.py에서 테스트를 수행하고 다른 곳에서 사용할 수있는 변수를 설정하십시오.
-
==============================
10.나는 사용한다:
나는 사용한다:
DEV_SERVERS = [ 'mymachine.local', ] DEVELOPMENT = platform.node() in DEV_SERVERS
.node ()가 귀하의 컴퓨터에서 반환하는 것에주의를 기울여야합니다. 민감한 개발 정보를 우연히 노출시키지 않도록 기본값이 개발되지 않는 것이 중요합니다.
컴퓨터를 고유하게 식별하는보다 복잡한 방법을 살펴볼 수도 있습니다.
-
==============================
11.Aryeh의 답변에서 영감을 얻은, 내가 사용하기 위해 고안 한 트릭은 sys.argv [0]에서 관리 스크립트의 이름을 찾는 것입니다.
Aryeh의 답변에서 영감을 얻은, 내가 사용하기 위해 고안 한 트릭은 sys.argv [0]에서 관리 스크립트의 이름을 찾는 것입니다.
USING_DEV_SERVER = "pulpdist/manage_site.py" in sys.argv[0]
(나의 유스 케이스는 테스트 서버를 실행할 때 장고 네이티브 인증을 자동으로 활성화하는 것이다. 개발 서버에서도 아파치에서 실행될 때 현재 프로젝트에 대한 모든 인증은 Kerberos를 통해 처리된다)
-
==============================
12.WSGI (mod_wsgi, gunicorn, 웨이트리스 등) 대 manage.py (runserver, 테스트, 마이그레이션 등) 또는 다른 어떤 것에서 실행 중인지 확인할 수 있습니다.
WSGI (mod_wsgi, gunicorn, 웨이트리스 등) 대 manage.py (runserver, 테스트, 마이그레이션 등) 또는 다른 어떤 것에서 실행 중인지 확인할 수 있습니다.
import sys WSGI = 'django.core.wsgi' in sys.modules
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
'PYTHON' 카테고리의 다른 글
[PYTHON] pandas 데이터 프레임의 열을 하나씩 변경 하시겠습니까? (0) | 2018.10.29 |
---|---|
[PYTHON] 이 간단한 예제에서 datetime.strptime이 작동하지 않는 이유는 무엇입니까? (0) | 2018.10.29 |
[PYTHON] 장고 Rest 프레임 워크 - ModelSerializer에서 사용자 정의 필드를 추가하는 방법 (0) | 2018.10.29 |
[PYTHON] 파이썬 3.x에서 파이썬의 객체를 상속하는 것이 필요하거나 유용합니까? (0) | 2018.10.29 |
[PYTHON] 튜플에 값을 추가하는 방법? (0) | 2018.10.29 |