[PYTHON] Django Heroku Deploy 2

Annahme

Dies ist eine Fortsetzung des vorherigen Artikels "Django Heroku Deploy 1". https://qiita.com/yusuke_mrmt/items/1a3ee727d119617b2d85

Bereitstellen

Nachdem wir den Bereich für die Bereitstellung der App gesichert haben, werden wir sie tatsächlich bereitstellen.

Ablauf zur Bereitstellung

Vor der Bereitstellung müssen Sie die folgenden Elemente festlegen.

  1. Erstellen Sie eine Einstellungsdatei für Heroku
  2. Installation des Anwendungsservers
  3. Installieren Sie Django-Heroku 4, Datenbankeinstellungen
  4. Zulässige Hosteinstellungen
  5. Statische Dateieinstellungen
  6. Trennung der Einstellungen der Entwicklungsumgebung und der Einstellungen der Produktionsumgebung

Es wird das oben genannte sein. In Ordnung bringen.

1. Erstellen Sie eine Einstellungsdatei für Heroku

Fügen Sie die folgenden zwei Dateien direkt unter dem Projektverzeichnis hinzu.
■ Erstellen von runtime.txt runtime.txt ist eine Datei, die die von Heroku verwendete Python-Version angibt. Speichern Sie es direkt unter dem Projektverzeichnis (dasselbe Verzeichnis wie manage.py) mit den folgenden Inhalten.

runtime.txt


python-3.7.3

■ Erstellen eines Procfiles Ein Procfile ist eine Datei, die die Befehle beschreibt, die tatsächlich auf Heroku ausgeführt werden.
Bitte speichern Sie mit folgendem Inhalt.
web: gunicorn config.wsgi --log-file -

Ich führe einen Befehl namens Gunicorn aus. gunicorn ist ein Python-Anwendungsserver.

2. Installation des Anwendungsservers

Installieren Sie es, damit Sie Gunicorn ausführen können, das Sie zuvor in Ihrem Procfile als Befehl zum Ausführen auf Heroku erwähnt haben.

$ pipenv install gunicorn

3. Installieren Sie Django-Heroku

Installieren Sie eine Bibliothek namens django-heroku, die das Anwenden der Django-Einstellungen auf Heroku vereinfacht.

$ pipenv install django-heroku

4, Datenbankeinstellungen

Richten Sie die Datenbank für die Produktionsumgebung ein. Stellen Sie DATABASES in config / settings.py wie folgt ein.

settings.py


...#Kürzung

# Database
# https://docs.djangoproject.com/en/2.2/ref/settings/#databases

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.sqlite3',
        'NAME': os.path.join(BASE_DIR, 'db.sqlite3'),
    }
}

#Nachtrag
import dj_database_url
db_from_env = dj_database_url.config()
DATABASES['default'].update(db_from_env)

...#Kürzung

Importieren Sie die Datenbankeinstellungen für Heroku mit dj_database_url </ code> und DATENBANKEN überschreiben.

5. Zulässige Hosteinstellungen

Django verwendet eine Whitelist-Methode, um Hosts einzuschränken. Setzen Sie ALLOWED_HOSTS in config / settings.py auf den App-Namen (den mit der ersten eindeutigen Einstellung).

settings.py


ALLOWED_HOSTS = ["<Heroku App Name>.herokuapp.com"]

Wenn Sie dies nicht einstellen, verhindern die Sicherheitsfunktionen von Django, dass Sie auf Ihre App zugreifen können. ↓ ↓ Beispiel

settings.py


ALLOWED_HOSTS = ["banban-2020.herokuapp.com"]

6. Statische Dateieinstellungen

Weil ich bei der Bereitstellung in den statischen Dateieinstellungen stecken bleibe Fügen wir die Einstellungen in der statischen Datei von config / settings.py wie folgt hinzu.

settings.py


...#Kürzung

# Static files (CSS, JavaScript, Images)
# https://docs.djangoproject.com/en/2.2/howto/static-files/

STATIC_ROOT = os.path.join(BASE_DIR, 'staticfiles') #Nachtrag
STATIC_URL = '/static/'

#Nachtrag
STATICFILES_DIRS = (
    os.path.join(BASE_DIR, 'static'),
)

...#Kürzung

Erstellen Sie dann ein statisches Verzeichnis im Stammverzeichnis Ihres Projekts Erstellen Sie eine leere Datei mit dem Namen .gitkeep </ code>.

・ ・ ・

[Ergänzung] Gründe für das Hinzufügen von .gitkeep </ code> Statische Dateien mit Heroku liefern Ich muss ein statisches Verzeichnis erstellen, Da ein leeres Verzeichnis nicht von git verwaltet werden kann, erstellen wir eine leere Datei mit dem Namen .gitkeep. Es muss nicht .gitkeep heißen, Wenn Sie ein solches leeres Verzeichnis mit git verwalten möchten, Es scheint üblich zu sein, es .gitkeep zu nennen.

7. Trennung der Einstellungen der Entwicklungsumgebung und der Einstellungen der Produktionsumgebung

Schließlich werden die bisher festgelegten Inhalte zwischen der Entwicklungsumgebung und der Produktionsumgebung getrennt. Fügen Sie am Ende von config / settings.py Folgendes hinzu.

settings.py


...
...
...#Kürzung

DEBUG = False

try:
    from config.local_settings import *
except ImportError:
    pass

if not DEBUG:
    import django_heroku
    django_heroku.settings(locals())

In django_heroku.settings (local ()) wendet django_heroku die Einstellungen für Heroku an.

Erstellen Sie als Nächstes eine Konfigurationsdatei für die Entwicklungsumgebung, die nicht in Heroku bereitgestellt wird. Erstellen Sie config / local_settings.py und speichern Sie es mit den folgenden Inhalten.

local_settings.py


import os
BASE_DIR = os.path.dirname(os.path.dirname(__file__))

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.sqlite3',
        'NAME': os.path.join(BASE_DIR, 'db.sqlite3'),
    }
}

ALLOWED_HOSTS = []

DEBUG = True

Erstellen Sie dann eine Gitignore-Datei direkt unter dem Projekt (dasselbe Verzeichnis wie manage.py) und erstellen Sie sie mit den folgenden Inhalten.

.gitignore


staticfiles
config/local_settings.py
db.sqlite3

.gitignore ist eine Datei, die Dateien deklariert, die nicht von git verwaltet werden. Die hier beschriebene Datei config / local_settings.py wird nicht an Heroku übertragen. Mit anderen Worten, es ist eine Einstellung für die Entwicklungsumgebung, die sich nicht in der Produktionsumgebung widerspiegelt.

Dies ist das Ende der Änderung bis zur Bereitstellung.

In Heroku bereitstellen

Sie können bereitstellen, indem Sie mit git wie im folgenden Befehl im Terminal drücken.

.gitignore


$ git add .
$ git commit -m "initial commit"
$ git push heroku master

↓ ↓ Geben Sie den obigen $ git push heroku master </ code> ein. Wenn dies funktioniert, sieht es wie folgt aus.

.gitignore


$ git push heroku master
Total 0 (delta 0), reused 0 (delta 0)
remote: Compressing source files... done.
remote: Building source:
remote:
remote: -----> Python app detected
remote: -----> Installing python-3.7.3
remote: -----> Installing pip
remote: -----> Installing dependencies with Pipenv 2018.5.18…
remote:        Installing dependencies from Pipfile.lock (8f0d8d)…
remote: -----> Installing SQLite3
remote: -----> $ python manage.py collectstatic --noinput
remote:        120 static files copied to '/tmp/build_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx/staticfiles'.
remote:
remote: -----> Discovering process types
remote:        Procfile declares types -> (none)
remote:
remote: -----> Compressing...
remote:        Done: 64.9M
remote: -----> Launching...
remote:        Released v1
remote:        https://banban-2020.herokuapp.com/ deployed to Heroku
remote:
remote: Verifying deploy... done.
To https://git.heroku.com/banban-2020.git
 * [new branch]      master -> master

Führen Sie als Nächstes die Migration mit dem folgenden Befehl im Terminal durch. Der Befehl pipenv run python manage.py migrate wurde in der lokalen Umgebung ausgeführt Das Bild ist, dass es auch in einer Produktionsumgebung gemacht wird.

.gitignore


$ heroku run python manage.py migrate

Running python manage.py migrate on ⬢ banban-2020... up, run.8064 (Free)
Operations to perform:
  Apply all migrations: admin, auth, contenttypes, banban, sessions
Running migrations:
  Applying contenttypes.0001_initial... OK
  Applying auth.0001_initial... OK
  Applying admin.0001_initial... OK
  Applying admin.0002_logentry_remove_auto_add... OK
  Applying admin.0003_logentry_add_action_flag_choices... OK
  Applying contenttypes.0002_remove_content_type_name... OK
  Applying auth.0002_alter_permission_name_max_length... OK
  Applying auth.0003_alter_user_email_max_length... OK
  Applying auth.0004_alter_user_username_opts... OK
  Applying auth.0005_alter_user_last_login_null... OK
  Applying auth.0006_require_contenttypes_0002... OK
  Applying auth.0007_alter_validators_add_error_messages... OK
  Applying auth.0008_alter_user_username_max_length... OK
  Applying auth.0009_alter_user_last_name_max_length... OK
  Applying auth.0010_alter_group_name_max_length... OK
  Applying auth.0011_update_proxy_permissions... OK
  Applying banban.0001_initial... OK
  Applying banban.0002_card... OK
  Applying sessions.0001_initial... OK

Wenn Sie fertig sind, gehen Sie zu https: // Heroku appname.com/appname/ </ code>! !!

Die Bereitstellung ist abgeschlossen.

Beim Bereitstellen ist ein Fehler aufgetreten

3, Fehler bei der Installation von django-heroku </ b> Geben Sie $ pipenv install django-heroku </ code> in das Terminal ein ... Ich habe eine sehr lange Fehlererklärung erhalten. Am Ende des Fehlersatzes stand der folgende Satz.

.gitignore


ERROR: ERROR: Package installation failed...
  ☤  ▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉ 0/1 — 

Die Lösung

Ich habe den folgenden Befehl im Terminal eingegeben.

xcode-select --install
env LDFLAGS="-I/usr/local/opt/openssl/include -L/usr/local/opt/openssl/lib" pipenv install psycopg2
  • Referenzartikel https://stackoverflow.com/questions/39767810/cant-install-psycopg2-package-through-pip-install-is-this-because-of-sierra

Fehler beim Bereitstellen von Heroku </ b> Wenn ich $ git push heroku master </ code> in das Terminal eingebe, tritt der folgende Fehler auf.

$ git push heroku master

Enumerating objects: 93, done.
Counting objects: 100% (93/93), done.
Delta compression using up to 8 threads
Compressing objects: 100% (82/82), done.
Writing objects: 100% (93/93), 21.51 KiB | 2.39 MiB/s, done.
Total 93 (delta 33), reused 0 (delta 0)
remote: Compressing source files... done.
remote: Building source:
remote: 
remote:  !     No default language could be detected for this app.
remote: 			HINT: This occurs when Heroku cannot detect the buildpack to use for this application automatically.
remote: 			See https://devcenter.heroku.com/articles/buildpacks
remote: 
remote:  !     Push failed
remote: Verifying deploy...
remote: 
remote: !	Push rejected to banban-2020.
remote: 
To https://git.heroku.com/banban-2020.git
 ![remote rejected] master -> master (pre-receive hook declined)
error: failed to push some refs to 'https://git.heroku.com/banban-2020.git'
muramatsuyuusukenoMacBook-Pro:banban muramatsuyuusuke$ git add .
muramatsuyuusukenoMacBook-Pro:banban muramatsuyuusuke$ git commit -m "initial"
On branch master
Your branch is up to date with 'origin/master'.

Die Lösung

Es wurde durch Generieren von require.txt gelöst. Als ich den folgenden Befehl im Terminal eingab und erneut zu Heroku drückte, verlief er ohne Probleme.

pipenv lock -r > requirements.txt

das ist alles.

Recommended Posts