Ich beabsichtige, der "Twelve-Factor App" -Methodik zu folgen, um meine Django-App auf Heroku zu bauen.
Ich folge der Kurzanleitung "Erste Schritte mit Django auf Heroku". Im Moment habe ich folgende Verzeichnisstruktur:
%Vor%Ich habe django-toolbelt installiert, meine einfache Django-Anwendung erstellt, den Prozess in meiner Procfile gestartet ... Alles schien gut zu funktionieren, aber die Probleme begannen, als ich die Anwendung für die Heroku-Umgebung konfigurierte und fügte hinzu:
%Vor%am Ende meiner setup.py-Datei.
Ich habe das Repository meiner Anwendung auf Heroku geschoben, die App in meinem Browser mit $ heroku open
erfolgreich besucht, aber lokal: dj_database_url.config()
hat ein leeres Wörterbuch zurückgegeben .
OS X 10.8.4
pip == 1.4.1
virtualenv == 1.10.1
virtualenvwrapper == 4.1.1
wsgiref == 0.1.2
Postgres.app läuft auf Port 5432
Umgebungsvariablen:
%Vor% Django == 1.5.2
dj-database-url == 0.2.2
dj-static == 0.0.5
django-toolbelt == 0.0.1
gunicorn == 18.0
psycopg2 == 2.5.1
statisch == 0.4
Das habe ich in meiner wsgi.py-Datei:
%Vor%Das habe ich in meiner Datei manage.py:
%Vor%Das habe ich in meinem Procfile:
%Vor%Umgebungsvariablen:
%Vor%Umgebungsvariablen:
%Vor%Speichern Sie die Konfiguration in der Umgebung: aus der Twelve-Factor App
@adamwiggins schrieb:
Die Zwölf-Faktoren-App speichert die Konfiguration in Umgebungsvariablen ... Env Vars können einfach zwischen Deploys gewechselt werden, ohne dass Code geändert wird. im Gegensatz zu Konfigurationsdateien.
dj_database_url.config()
gibt ein leeres Objekt zurück: aus den Heroku-Foren
@chrisantonick antwortete:
... dj_database_url.config () ruft die Postgres-Anmeldedaten von der Heroku-Umgebungsvariablen. Aber auf Ihrem lokalen Rechner Variablen sind nicht da . Du musst sie in deine stecken / vend / bin / activate shell script ... setze die Variablen dort hinein. etwas wie
DATABASE_URL="xxx"
export DATENBANK_URL
Für jede Sache, die es braucht. Dann ... "deaktivieren" ... und ... "aktivieren" erneut, um es neu zu starten.
Erste Schritte mit Django- und Heroku-Anweisungen wurden ausgelöst Unsachgemäß konfigurierter Fehler: in den Heroku-Foren
@jwpe antwortete:
... dj-database-url ist ein großartiges Dienstprogramm, wie Sie es verwenden können genau den gleichen settings.py Code in deiner Entwicklung und Produktion Umgebungen, wie in den "12-Faktor-App-Prinzipien" empfohlen ... was dj_database_url.config () sucht nach der DATABASE_URL Umgebungsvariable, und dann es in Djangos bevorzugt zu analysieren Format ... wenn Sie einen Postgres-DB nicht manuell erstellt und hochgestuft haben auf Heroku ist DATABASE_URL nicht vorhanden und der Unsachgemäß konfigurierter Fehler wird ausgelöst. Festlegen der Standardeinstellung für dj_database_url.config () als Ihre lokale DB-URL ist eine Möglichkeit, um sicherzustellen dass Ihre Anwendung in einer Entwicklungsumgebung funktioniert. Es ist jedoch nicht unbedingt der einzige Weg. Vielleicht besser Alternativ können Sie DATABASE_URL in Ihrer lokalen .env-Datei manuell festlegen. Wenn Sie Ihre App dann lokal mit Foreman ausführen, wird sie geladen als Umgebungsvariable und dj_database_url wird es finden. Also dein .env würde enthalten:
DATABASE_URL=postgres://user:pass@localhost/dbname
Das bedeutet, dass Sie in
settings.py
nur haben müssten:
DATABASES['default']= dj_database_url.config()
... Der Vorteil der Verwendung einer lokalen Umgebungsvariablen anstelle von a Single, hart-codierte Standard ist, dass Ihr Code in jedem ausgeführt wird Umgebung, in der die DATABASE_URL festgelegt ist. Wenn Sie den Namen von ändern Ihre lokale DB, oder möchten Sie Ihren Code auf einer anderen Dev-Maschine ausführen, Sie müssen nur Ihre .env-Datei aktualisieren, anstatt daran zu basteln settings.py .
Wie man die Einstellungen für Produktion / Staging / Dev Django verwaltet: von Heroku Forums
@rdegges antwortete:
... versuchen, dass Ihre Anwendung sich so verhält, dass:
- Wenn Sie die App auf Ihrem Laptop ausführen, verwendet sie Ihren lokalen Postgres-Server.
- Wenn Sie die App auf Ihrer Staging-Heroku-App ausführen, wird das Postgres-Server-Addon verwendet.
- Wenn Sie die App in Ihrer Produktions-Heroku-App ausführen, wird das Postgres-Server-Add-On verwendet.
Der beste Weg, dies zu erreichen, ist die Verwendung von Umgebungsvariablen!... Umgebungsvariablen sind der eleganteste (und skalierbarste) Weg zu handle Anwendungskonfiguration zwischen verschiedenen Umgebungen ... Definieren Sie statt vieler Einstellungsdateien eine einzelne Datei: settings.py, und nutzen Sie Umgebungsvariablen zum Ziehen Serviceinformationen und Anmeldedaten ... Auf Heroku können Sie einstellen Umgebungsvariablen manuell durch Ausführen von:
%Vor%... es gibt immer Kenneth Reitz's großes Auto-Tool. Dies ermöglicht es Ihnen Definieren Sie eine einfache .env-Datei in Ihrem Projektverzeichnis ... Und jedes Mal, wenn Sie Geben Sie Ihr Projektverzeichnis ein, diese Umgebungsvariablen werden sein Automatisch eingestellt, so dass Sie nichts Besonderes tun müssen! Gerade Führen Sie Ihr Projekt und alles funktioniert wie erwartet:
python manage.py runserver
Ich habe DATABASE_URL
in meiner .env-Datei manuell gesetzt: DATABASE_URL=postgres://dbuser:[email protected]:5432/dbname
Aber wenn ich $ foreman start
-Befehl ausführen:
und habe versucht, meine App im Browser http://0.0.0.0:5000
:
Allerdings hat dj_database_url.config()
zurückgegeben:
Ich habe DATABASE_URL
in meiner .env-Datei manuell gesetzt und den Host geändert. Ich ersetzte "ec2-184-73-162-34.compute-1.amazonaws.com:5432" durch "localhost: 5000". $ deactivate
und dann $ workon hellodjango_venv
erneut.
DATABASE_URL=postgres://dbuser:dbpassword@localhost:5000/dbname
Aber wenn ich $ foreman start
command ausführen:
und habe versucht, meine App im Browser http://0.0.0.0:5000
:
Diesmal hat dj_database_url.config()
zurückgegeben:
Ich habe autoenv mac-pol:~ oubiga$ pip install autoenv
installiert
Aus diesem Kochbuch schrieb Kenneth Reitz, ich habe gesagt:
in meiner .bashrc-Datei.
Ich starte $ foreman start
command:
und habe versucht, meine App im Browser http://0.0.0.0:5000
zu öffnen: Es hat funktioniert!
Aber, dj_database_url.config()
gibt ein leeres Wörterbuch zurück.
Ich war neugierig auf den Befehl python manage.py runserver
und habe es überprüft.
und habe versucht, meine App im Browser http://127.0.0.1:8000/
zu öffnen: Es hat nicht funktioniert!
Ein ImportError: No module named hellodjango.urls
wurde ausgelöst.
Ich habe ROOT_URLCONF = 'hellodjango.hellodjango.urls'
in meiner settings.py Datei durch ROOT_URLCONF = 'hellodjango.urls'
ersetzt und es hat endlich funktioniert.
Wie erwartet, hat dj_database_url.config()
ein leeres Wörterbuch zurückgegeben.
Jetzt fühle ich mich ein wenig überwältigt. Ich fürchte, ich verstehe ein Kernkonzept hier nicht.
dj_database_url.config()
manchmal ein vollständig ausgefülltes und manchmal ein leeres Wörterbuch zurück? Vielen Dank im Voraus.
Ich bin auch mit den Postgres festgefahren, hier ist, was ich in settings.py getan habe, um lokale Einstellungen hinzuzufügen:
%Vor%Natürlich müssen Sie die Datenbank nach den folgenden Schritten erstellt haben. Die Lösung kam von Ссылка
Tags und Links django heroku environment-variables gunicorn 12factor