/ / Wie führe ich Django-Migrationen automatisch auf Deis aus, wenn ich ein Buildpack-Deployment verwende? - Django, Deis

Wie führe ich Django-Migrationen automatisch auf Deis aus, wenn ich ein Buildpack-Deployment verwende? - Django, Deis

Der Post-Compile Hook auf Deis scheint anders zu funktionieren als auf Heroku.

Auf Heroku könnte ich einfach eine bin / post-compile-Datei hinzufügen, die folgendes enthält:

#!/usr/bin/env bash

python manage.py migrate --noinput

Auf Deis gibt mir das eine Rückverfolgung

Traceback (most recent call last):
File "manage.py", line 8, in <module>
from django.core.management import execute_from_command_line
No module named django.core.management

Hat jemand Django auf Deis mit Buildpacks ausgeführt und ein funktionierendes Beispiel dafür?

Antworten:

1 für die Antwort № 1

Ich habe schließlich zwei Lösungen gefunden.

Die einfache Antwort ist, nur einen vollständigen Pfad zu Python anzugeben. Ich habe dies getestet, indem ich eine bin / post-compile-Datei hinzugefügt habe Deis / Beispiel-Python-Django

#!/usr/bin/env bash

/app/.heroku/python/bin/python manage.py migrate --noinput

Diese Lösung funktioniert jedoch nicht, wenn Sie Zugriff auf eine Ihrer Konfigurationsvariablen benötigen, was sehr wahrscheinlich der Fall ist, wenn Sie die 12 Factor App-Methode befolgen.

Leider führt deis die Hooks nach der Kompilierung nicht so aus wie Heroku, also müssen wir zuerst unsere Umgebungsvariablen exportieren Sub-Env Funktion von der heroku-buildpack-python als Leitfaden habe ich mir das ausgedacht ...

#!/usr/bin/env bash

echo "-----> Running post-compile hook"

BUILD_DIR=/tmp/build
ENV_DIR=/tmp/environment

BLACKLIST="^(GIT_DIR|STACK|PYTHONHOME|LD_LIBRARY_PATH|LIBRARY_PATH|PATH)$"

# Python-specific variables.
export PYTHONHOME=$BUILD_DIR/.heroku/python
export PYTHONPATH=$BUILD_DIR/

if [ -d "$ENV_DIR" ]; then
for e in $(ls $ENV_DIR); do
echo "$e" | grep -E "$WHITELIST" | grep -qvE "$BLACKLIST" &&
export "$e=$(cat $ENV_DIR/$e)"
:
done
fi

$PYTHONHOME/bin/python manage.py migrate --noinput