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'),
    },
}

Credits: Zwei Scoops von Django: Best Practices für Django 1.8 von Daniel Roy Greenfeld und Audrey RoyGreenfeld. Copyright 2015 Two Scoops Press (ISBN 978-0981467344)

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'])


Modified text is an extract of the original Stack Overflow Documentation
Lizenziert unter CC BY-SA 3.0
Nicht angeschlossen an Stack Overflow