Django-App auf Heroku bereitstellen: Kann ich Umgebungsvariablen in der .env-Datei manuell festlegen? Muss ich Tools wie autoenv, heroku-config ... installieren?

9

Mein Ziel:

Ich beabsichtige, der "Twelve-Factor App" -Methodik zu folgen, um meine Django-App auf Heroku zu bauen.

Einführung:

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 .

Lokal:

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%

hellodjango_venv:

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%

Auf Heroku:

Umgebungsvariablen:

%Vor%

Forschung:

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

Als erster Versuch:

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:

%Vor%

und habe versucht, meine App im Browser http://0.0.0.0:5000 :

zu öffnen %Vor%

Allerdings hat dj_database_url.config() zurückgegeben:

%Vor%

Als zweiter Versuch:

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:

%Vor%

und habe versucht, meine App im Browser http://0.0.0.0:5000 :

zu öffnen %Vor%

Diesmal hat dj_database_url.config() zurückgegeben:

%Vor%

Als dritter Versuch:

Ich habe autoenv mac-pol:~ oubiga$ pip install autoenv
installiert Aus diesem Kochbuch schrieb Kenneth Reitz, ich habe gesagt:

%Vor%

in meiner .bashrc-Datei.

Ich starte $ foreman start command:

%Vor%

und habe versucht, meine App im Browser http://0.0.0.0:5000 zu öffnen: Es hat funktioniert!

%Vor%

Aber, dj_database_url.config() gibt ein leeres Wörterbuch zurück.

Als letzter Versuch:

Ich war neugierig auf den Befehl python manage.py runserver und habe es überprüft.

%Vor%

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.

Also:

Jetzt fühle ich mich ein wenig überwältigt. Ich fürchte, ich verstehe ein Kernkonzept hier nicht.

  • Was spricht dafür, Gunicorn anstelle des Django-Entwicklungsservers zu verwenden?
  • Warum gibt dj_database_url.config() manchmal ein vollständig ausgefülltes und manchmal ein leeres Wörterbuch zurück?
  • Kann ich Umgebungsvariablen in der .env-Datei manuell festlegen? Muss ich Tools wie autoenv, heroku-config ... installieren?

Vielen Dank im Voraus.

    
oubiga 12.09.2013, 00:03
quelle

1 Antwort

1

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 Ссылка

    
Song Keang 20.11.2013 17:47
quelle