수색…


시간대 설정

Django가 settings.py 파일에서 사용할 시간대를 설정할 수 있습니다. 예 :

TIME_ZONE = 'UTC'  # use this, whenever possible
TIME_ZONE = 'Europe/Berlin'
TIME_ZONE = 'Etc/GMT+1'

유효한 시간대 목록은 다음과 같습니다.

Windows 환경에서 실행하는 경우 시스템 시간대 와 동일하게 설정해야합니다.

장고가 타임 존 인식 datetimes를 사용하는 것을 원하지 않는다면 :

USE_TZ = False

장고 모범 사례는 UTC 를 사용하여 데이터베이스에 정보를 저장하도록 요구합니다.

웹 사이트가 하나의 시간대에서만 사용 가능하더라도 데이터베이스의 UTC에 데이터를 저장하는 것이 좋습니다. 주된 이유는 일광 절약 시간 (DST)입니다. 많은 국가에서 시계가 봄에 앞으로 이동하고 가을에 뒤로 이동하는 DST 시스템이 있습니다. 현지 시간으로 일하는 경우 전환이 발생할 때 일 년에 두 번 오류가 발생할 가능성이 큽니다.

https://docs.djangoproject.com/en/stable/topics/i18n/timezones/

설정 액세스

모든 설정을 가져 오면 코드에서 사용할 수 있습니다. 이렇게하려면 파일에 다음 가져 오기를 추가하십시오.

from django.conf import settings

그런 다음 settings 모듈의 속성으로 설정에 액세스 할 수 있습니다 (예 :

if not settings.DEBUG:
    email_user(user, message)

앱 이식성을 보장하기 위해 BASE_DIR 사용

응용 프로그램에서 경로를 하드 코딩하는 것은 좋지 않습니다. 코드가 다른 시스템에서 원활하게 작동 할 수 있도록 항상 상대 URL을 사용해야합니다. 이것을 설정하는 가장 좋은 방법은 다음과 같은 변수를 정의하는 것입니다.

import os
BASE_DIR = os.path.dirname(os.path.dirname(__file__))

그런 다음이 BASE_DIR 변수를 사용하여 다른 모든 설정을 정의하십시오.

TEMPLATE_PATH = os.path.join(BASE_DIR, "templates")
STATICFILES_DIRS = [
    os.path.join(BASE_DIR, "static"),

]

등등. 이렇게하면 아무 걱정없이 여러 컴퓨터에서 코드를 이식 할 수 있습니다.

그러나 os.path 는 약간 장황하다. 예를 들어 설정 모듈이 project.settings.dev 인 경우 다음과 같이 작성해야합니다.

BASE_DIR = os.path.dirname(os.path.dirname(os.path.dirname(__file__)))

대안은 unipath 모듈 ( pip install unipath )을 사용하는 것입니다.

from unipath import Path

BASE_DIR = Path(__file__).ancestor(2)  # or ancestor(3) if using a submodule

TEMPLATE_PATH = BASE_DIR.child('templates')
STATICFILES_DIRS = [
    BASE_DIR.child('static'),
]

환경 변수를 사용하여 서버에서 설정 관리

환경 변수를 사용하는 것은 The Factor App에 설명 된 것처럼 환경에 따라 앱의 설정을 지정하는 데 널리 사용되는 방법입니다.

배포 환경간에 구성이 변경 될 가능성이 있으므로 응용 프로그램 소스 코드를 파고 들지 않고 구성을 수정하는 것은 물론 응용 프로그램 파일과 소스 코드 저장소 외부에 비밀 정보를 유지하는 것은 매우 흥미로운 방법입니다.

Django에서 주요 설정은 프로젝트 폴더의 settings.py 에 있습니다. 단순한 파이썬 파일이기 때문에 표준 라이브러리의 Python의 os 모듈을 사용하여 환경에 액세스 할 수 있습니다 (적절한 기본값을 가질 수도 있습니다).

settings.py

import os

SECRET_KEY = os.environ.get('APP_SECRET_KEY', 'unsafe-secret-key')

DEBUG = bool(os.environ.get('DJANGO_DEBUG', True) == 'False')

ALLOWED_HOSTS = os.environ.get('DJANGO_ALLOWED_HOSTS', '').split()

DATABASES = {
    'default': {
        'ENGINE': os.environ.get('APP_DB_ENGINE', 'django.db.backends.sqlite3'),
        'NAME': os.environ.get('DB_NAME', 'db.sqlite'),    
        'USER': os.environ.get('DB_USER', ''),
        'PASSWORD': os.environ.get('DB_PASSWORD', ''),
        'HOST': os.environ.get('DB_HOST', None),
        'PORT': os.environ.get('DB_PORT', None),
        'CONN_MAX_AGE': 600,
    }
}

Django를 사용하면 데이터베이스 기술을 변경할 수 있으므로 개발 시스템에서 sqlite3을 사용할 수 있습니다. 소스 제어 시스템에 커밋하는 경우 sedite가 기본이어야합니다. 이것이 가능할 수도 있지만 바람직하지 않습니다.

앱의 데이터베이스, 큐 시스템 또는 캐시와 같은 백업 서비스는 dev / prod 패리티가 중요한 영역입니다. ( 십이 - 인자 App - Dev / prod parity )

데이터베이스 연결에 DATABASE_URL 매개 변수를 사용하려면 관련 예제를 살펴보십시오.

여러 설정 사용

Django의 기본 프로젝트 레이아웃은 하나의 settings.py 만듭니다. 다음과 같이 분할하는 것이 종종 유용합니다.

myprojectroot/
    myproject/
        __init__.py
        settings/
            __init__.py
            base.py
            dev.py
            prod.py
            tests.py

이를 통해 개발, 생산, 테스트 등 어떤 방식 으로든 다른 설정으로 작업 할 수 있습니다.

기본 레이아웃에서이 레이아웃으로 이동할 때 원래 settings.pysettings/base.py 됩니다. 다른 모든 서브 모듈이 from .base import * 로 시작하여 settings/base.py 를 "서브 클래스"할 때. 예를 들어, 다음은 settings/dev.py 과 같습니다.

# -*- coding: utf-8 -*-
from .base import *  # noqa

DEBUG = True
INSTALLED_APPS.extend([
    'debug_toolbar',
])
EMAIL_BACKEND = 'django.core.mail.backends.console.EmailBackend'
INTERNAL_IPS = ['192.168.0.51', '192.168.0.69']

대안 # 1

django-admin 명령이 제대로 작동하려면 DJANGO_SETTINGS_MODULE 환경 변수 (기본값은 myproject.settings )를 설정 DJANGO_SETTINGS_MODULE 합니다. 개발 중에 myproject.settings.dev 설정합니다. 프로덕션 환경에서는 myproject.settings.prod 설정합니다. virtualenv를 사용하는 경우 postactivate 스크립트에서 설정하는 것이 가장 좋습니다.

#!/bin/sh
export PYTHONPATH="/home/me/django_projects/myproject:$VIRTUAL_ENV/lib/python3.4"
export DJANGO_SETTINGS_MODULE="myproject.settings.dev"

DJANGO_SETTINGS_MODULE 가리 --settings 않는 설정 모듈을 한 번 사용하려면 django-admin--settings 옵션을 사용할 수 있습니다.

django-admin test --settings=myproject.settings.tests

대안 # 2

DJANGO_SETTINGS_MODULE 을 기본 설정 ( myproject.settings )으로 남기고 싶다면 __init__.py 파일에 가져 오기를 놓음으로써로드 할 설정을 settings 모듈에 간단히 알릴 수 있습니다.

위의 예에서 __init__.py 다음과 같이 설정하면 동일한 결과를 얻을 수 있습니다.

from .dev import *

여러 요구 사항 파일 사용

각 요구 사항 파일은 설정 파일의 이름과 일치해야합니다. 자세한 내용은 여러 설정 사용을 읽으십시오.

구조

djangoproject
├── config
│   ├── __init__.py
│   ├── requirements
│   │   ├── base.txt
│   │   ├── dev.txt
│   │   ├── test.txt
│   │   └── prod.txt
│   └── settings
└── manage.py

base.txt 파일에서 모든 환경에서 사용되는 종속성을 배치합니다.

# base.txt
Django==1.8.0
psycopg2==2.6.1
jinja2==2.8

그리고 다른 모든 파일에서 -r base.txt 하여 기본 종속성을 포함시키고 현재 환경에 필요한 특정 종속성을 추가하십시오.

# dev.txt
-r base.txt # includes all dependencies in `base.txt`

# specific dependencies only used in dev env
django-queryinspect==0.1.0
# test.txt
-r base.txt # includes all dependencies in `base.txt`

# specific dependencies only used in test env
nose==1.3.7
django-nose==1.4
# prod.txt
-r base.txt # includes all dependencies in `base.txt`

# specific dependencies only used in production env
django-queryinspect==0.1.0
gunicorn==19.3.0
django-storages-redux==1.3
boto==2.38.0

마지막으로 의존성을 설치합니다. 예 : dev env : pip install -r config/requirements/dev.txt

JSON 파일을 사용하여 비밀 데이터 숨기기

Git 또는 SVN과 같은 VCS를 사용할 때, 버전이 변경되지 않아야하는 일부 비밀 데이터 (저장소가 공개 또는 비공개인지 여부)가 있습니다.

이러한 데이터 중에서 SECRET_KEY 설정과 데이터베이스 암호를 찾습니다.

버전 관리에서 이러한 설정을 숨기는 일반적인 방법은 프로젝트의 루트에 secrets.json 파일을 만드는 것입니다 ( " Two Scoops of Django "에 감사드립니다 ).

{
    "SECRET_KEY": "N4HE:AMk:.Ader5354DR453TH8SHTQr",
    "DB_PASSWORD": "v3ry53cr3t"
}

무시 목록에 추가하십시오 ( .gitignore for git).

*.py[co]
*.sw[po]
*~
/secrets.json

그런 다음 settings 모듈에 다음 기능을 추가하십시오.

import json
import os
from django.core.exceptions import ImproperlyConfigured

with open(os.path.join(BASE_DIR, 'secrets.json')) as secrets_file:
    secrets = json.load(secrets_file)

def get_secret(setting, secrets=secrets):
    """Get secret setting or fail with ImproperlyConfigured"""
    try:
        return secrets[setting]
    except KeyError:
        raise ImproperlyConfigured("Set the {} setting".format(setting))

그런 다음 설정을 다음과 같이 채 웁니다.

SECRET_KEY = get_secret('SECRET_KEY')
DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.postgres',
        'NAME': 'db_name',
        'USER': 'username',
        'PASSWORD': get_secret('DB_PASSWORD'),
    },
}

학점 : Django의 두 가지 강습 : Daniel Roy Greenfeld와 Audrey RoyGreenfeld의 Django 1.8 모범 사례. Copyright 2015 두번의 보도 자료 (ISBN 978-0981467344)

환경에서 DATABASE_URL 사용

Heroku와 같은 PaaS 사이트에서는 여러 매개 변수 (호스트, 포트, 사용자, 암호 ...) 대신 단일 URL 환경 변수로 데이터베이스 정보를받는 것이 일반적입니다.

모듈 dj_database_url 이 자동으로 DATABASE_URL 환경 변수를 장고에서 데이터베이스 설정을 주입하기에 적합한 Python 사전으로 추출합니다.

용법:

import dj_database_url

if os.environ.get('DATABASE_URL'):
    DATABASES['default'] =
        dj_database_url.config(default=os.environ['DATABASE_URL'])


Modified text is an extract of the original Stack Overflow Documentation
아래 라이선스 CC BY-SA 3.0
와 제휴하지 않음 Stack Overflow