Django
die Einstellungen
Suche…
Zeitzone einstellen
Sie können die von Django verwendete Zeitzone in der Datei settings.py
einstellen. Beispiele:
TIME_ZONE = 'UTC' # use this, whenever possible
TIME_ZONE = 'Europe/Berlin'
TIME_ZONE = 'Etc/GMT+1'
Hier ist die Liste der gültigen Zeitzonen
Wenn Sie in einer Windows- Umgebung arbeiten, muss dies auf die Zeitzone Ihres Systems eingestellt sein .
Wenn Sie nicht möchten, dass Django zeitzonenabhängige Datumsangaben verwendet:
USE_TZ = False
Best Practices für Django erfordern die Verwendung von UTC
zum Speichern von Informationen in der Datenbank:
Auch wenn Ihre Website nur in einer Zeitzone verfügbar ist, empfiehlt es sich, Daten in UTC in Ihrer Datenbank zu speichern. Der Hauptgrund ist die Sommerzeit (DST). In vielen Ländern gibt es ein DST-System, bei dem die Uhren im Frühjahr vorwärts und im Herbst nach hinten verschoben werden. Wenn Sie in Ortszeit arbeiten, stoßen Sie wahrscheinlich zweimal pro Jahr auf Fehler, wenn die Übergänge auftreten.
https://docs.djangoproject.com/de/stable/topics/i18n/timezones/
Zugriff auf Einstellungen
Sobald Sie alle Einstellungen festgelegt haben, möchten Sie sie in Ihrem Code verwenden. Fügen Sie dazu den folgenden Import in Ihre Datei ein:
from django.conf import settings
Sie können dann auf Ihre Einstellungen als Attribute des settings
zugreifen, zum Beispiel:
if not settings.DEBUG:
email_user(user, message)
Verwenden Sie BASE_DIR, um die Portabilität der App sicherzustellen
Es ist keine gute Idee, Pfade in Ihrer Anwendung fest zu codieren. Sie sollten immer relative URLs verwenden, damit Ihr Code nahtlos auf verschiedenen Maschinen funktionieren kann. Die beste Möglichkeit, dies einzurichten, besteht darin, eine Variable wie diese zu definieren
import os
BASE_DIR = os.path.dirname(os.path.dirname(__file__))
Verwenden Sie dann diese BASE_DIR
Variable, um alle Ihre anderen Einstellungen zu definieren.
TEMPLATE_PATH = os.path.join(BASE_DIR, "templates")
STATICFILES_DIRS = [
os.path.join(BASE_DIR, "static"),
]
Und so weiter. Dadurch wird sichergestellt, dass Sie Ihren Code problemlos auf verschiedene Computer portieren können.
os.path
ist jedoch etwas ausführlich. Wenn Ihr Einstellungsmodul beispielsweise project.settings.dev
, müssen Sie project.settings.dev
schreiben:
BASE_DIR = os.path.dirname(os.path.dirname(os.path.dirname(__file__)))
Eine Alternative ist die Verwendung des unipath
Moduls (das Sie mit 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'),
]
Verwenden von Umgebungsvariablen zum Verwalten von Einstellungen über mehrere Server hinweg
Die Verwendung von Umgebungsvariablen ist eine weit verbreitete Methode, um die Konfiguration einer App abhängig von ihrer Umgebung festzulegen, wie in der Zwölf-Faktor-App angegeben .
Da sich die Konfigurationen wahrscheinlich zwischen den Implementierungsumgebungen ändern, ist dies eine sehr interessante Möglichkeit, die Konfiguration zu ändern, ohne den Quellcode der App durchsuchen zu müssen und Geheimnisse außerhalb der Anwendungsdateien und des Quellcode-Repositorys zu lassen.
In Django befinden sich die Haupteinstellungen als settings.py
im Ordner Ihres Projekts. Da es sich um eine einfache Python-Datei handelt, können Sie das os
Modul von Python aus der Standardbibliothek verwenden, um auf die Umgebung zuzugreifen (und sogar entsprechende Standardeinstellungen zu haben).
einstellungen.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,
}
}
Mit Django können Sie Ihre Datenbanktechnologie ändern, sodass Sie sqlite3 auf Ihrem Entwicklungscomputer verwenden können (und dies sollte ein vernünftiger Standard sein, wenn Sie sich für ein Quellcodeverwaltungssystem festlegen). Obwohl dies möglich ist, ist es nicht ratsam:
Back-Services, wie die Datenbank der App, das Warteschlangensystem oder der Cache, sind ein Bereich, in dem die Parität von Dev / Prod wichtig ist. ( Die Zwölf-Faktor-App - Dev / Prod-Parität )
Um einen DATABASE_URL-Parameter für die Datenbankverbindung zu verwenden, sehen Sie sich das zugehörige Beispiel an .
Mehrere Einstellungen verwenden
Das Django-Standardprojektlayout erstellt eine einzige settings.py
. Dies ist oft nützlich, um es so aufzuteilen:
myprojectroot/
myproject/
__init__.py
settings/
__init__.py
base.py
dev.py
prod.py
tests.py
Auf diese Weise können Sie mit verschiedenen Einstellungen arbeiten, je nachdem, ob Sie sich in Entwicklung, Produktion, Test oder was auch immer befinden.
Wenn Sie vom Standardlayout zu diesem Layout settings/base.py
, wird das ursprüngliche settings.py
zu settings/base.py
Wenn jedes andere Submodul die settings/base.py
"subclass" settings/base.py
indem mit from .base import *
. settings/dev.py
kann beispielsweise so aussehen:
# -*- 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']
Alternative # 1
Damit die django-admin
Befehle ordnungsgemäß funktionieren, müssen Sie die Umgebungsvariable DJANGO_SETTINGS_MODULE
(standardmäßig myproject.settings
) myproject.settings
. In der Entwicklung setzen Sie es auf myproject.settings.dev
. In der Produktion setzen Sie es auf myproject.settings.prod
. Wenn Sie eine Virtualenv verwenden, setzen Sie sie am besten in Ihrem postactivate
Skript:
#!/bin/sh
export PYTHONPATH="/home/me/django_projects/myproject:$VIRTUAL_ENV/lib/python3.4"
export DJANGO_SETTINGS_MODULE="myproject.settings.dev"
Wenn Sie ein Einstellungsmodul verwenden möchten , die nicht gezeigt wird DJANGO_SETTINGS_MODULE
für eine Zeit, können Sie die Verwendung --settings
Option von django-admin
:
django-admin test --settings=myproject.settings.tests
Alternative # 2
Wenn Sie DJANGO_SETTINGS_MODULE
in seiner Standardkonfiguration ( myproject.settings
) myproject.settings
, können Sie dem settings
einfach mitteilen, welche Konfiguration geladen werden soll, indem Sie den Import in Ihre __init__.py
. __init__.py
Datei __init__.py
.
Im obigen Beispiel könnte das gleiche Ergebnis erzielt werden, wenn für __init__.py
festgelegt wird:
from .dev import *
Verwendung mehrerer Anforderungsdateien
Jede Anforderungsdatei sollte mit dem Namen einer Einstellungsdatei übereinstimmen. Weitere Informationen finden Sie unter Mehrere Einstellungen verwenden .
Struktur
djangoproject
├── config
│ ├── __init__.py
│ ├── requirements
│ │ ├── base.txt
│ │ ├── dev.txt
│ │ ├── test.txt
│ │ └── prod.txt
│ └── settings
└── manage.py
base.txt
Datei base.txt
die in allen Umgebungen verwendeten Abhängigkeiten.
# base.txt
Django==1.8.0
psycopg2==2.6.1
jinja2==2.8
-r base.txt
in allen anderen Dateien -r base.txt
mit -r base.txt
und fügen Sie bestimmte Abhängigkeiten hinzu, die für die aktuelle Umgebung erforderlich sind.
# 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
Schließlich, um Abhängigkeiten zu installieren. Beispiel bei dev env: pip install -r config/requirements/dev.txt
Ausblenden geheimer Daten mithilfe einer JSON-Datei
Bei der Verwendung eines VCS wie Git oder SVN gibt es einige geheime Daten, die niemals versioniert werden dürfen (unabhängig davon, ob das Repository öffentlich oder privat ist).
Unter diesen Daten finden Sie die Einstellung SECRET_KEY
und das Datenbankkennwort.
secrets.json
diese Einstellungen vor der Versionskontrolle auszublenden, ist es üblich, eine Datei secrets.json
im Stammverzeichnis Ihres Projekts zu erstellen ( danke " Two Scoops of Django " für die Idee ):
{
"SECRET_KEY": "N4HE:AMk:.Ader5354DR453TH8SHTQr",
"DB_PASSWORD": "v3ry53cr3t"
}
Und füge es zu deiner Ignorierliste hinzu ( .gitignore
für git):
*.py[co]
*.sw[po]
*~
/secrets.json
Fügen Sie Ihrem settings
dann die folgende Funktion hinzu:
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))
Füllen Sie dann die Einstellungen wie folgt aus:
SECRET_KEY = get_secret('SECRET_KEY')
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.postgres',
'NAME': 'db_name',
'USER': 'username',
'PASSWORD': get_secret('DB_PASSWORD'),
},
}
Verwendung einer DATABASE_URL aus der Umgebung
In PaaS-Sites wie Heroku ist es üblich, die Datenbankinformationen anstelle von mehreren Parametern (Host, Port, Benutzer, Kennwort ...) als eine einzige URL-Umgebungsvariable zu erhalten.
Es gibt ein Modul, dj_database_url
das die Umgebungsvariable DATABASE_URL automatisch in ein Python-Wörterbuch extrahiert, das zum dj_database_url
der Datenbankeinstellungen in Django geeignet ist.
Verwendungszweck:
import dj_database_url
if os.environ.get('DATABASE_URL'):
DATABASES['default'] =
dj_database_url.config(default=os.environ['DATABASE_URL'])