[PYTHON] Django Heroku Deploy 2

supposition

Ceci est une continuation de l'article précédent "Django Heroku Deploy 1". https://qiita.com/yusuke_mrmt/items/1a3ee727d119617b2d85

Déployer

Maintenant que nous avons sécurisé la zone pour déployer l'application, nous allons la déployer.

Flux jusqu'au déploiement

Avant le déploiement, vous devez définir les éléments suivants.

  1. Créez un fichier de configuration pour Heroku
  2. Installation du serveur d'applications
  3. Installez django-heroku 4, paramètres de base de données
  4. Paramètres d'hôte autorisés
  5. Paramètres de fichier statique
  6. Séparation des paramètres d'environnement de développement et des paramètres d'environnement de production

Ce sera ce qui précède. Mettre en ordre.

1. Créez un fichier de configuration pour Heroku

Ajoutez les deux fichiers suivants directement sous le répertoire du projet.
■ Création de runtime.txt runtime.txt est un fichier qui spécifie la version de Python utilisée par Heroku. Enregistrez-le directement dans le répertoire du projet (le même répertoire que manage.py) avec le contenu suivant.

runtime.txt


python-3.7.3

■ Création d'un Procfile Un Procfile est un fichier qui décrit les commandes qui sont réellement exécutées sur Heroku.
Veuillez enregistrer avec le contenu suivant.
web: gunicorn config.wsgi --log-file -

J'exécute une commande appelée gunicorn. gunicorn est un serveur d'applications Python.

2. Installation du serveur d'applications

Installez-le pour pouvoir exécuter gunicorn, que vous avez mentionné plus tôt dans votre Procfile comme commande à exécuter sur Heroku.

$ pipenv install gunicorn

3. Installez django-heroku

Installez une bibliothèque appelée django-heroku qui simplifie le processus d'application des paramètres Django à Heroku.

$ pipenv install django-heroku

4, paramètres de base de données

Configurez la base de données pour l'environnement de production. Définissez DATABASES dans config / settings.py comme suit.

settings.py


...#réduction

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

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

...#réduction

Importez les paramètres de base de données pour Heroku avec dj_database_url </ code> et Écraser les bases de données.

5. Paramètres d'hôte autorisés

Django restreint les hôtes par une liste blanche. Définissez le nom de l'application (celui avec les paramètres uniques en premier) dans ALLOWED_HOSTS dans config / settings.py.

settings.py


ALLOWED_HOSTS = ["<Nom de l'application Heroku>.herokuapp.com"]

Si vous ne le définissez pas, les fonctionnalités de sécurité de Django vous empêcheront d'accéder à votre application. ↓ ↓ Exemple

settings.py


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

6. Paramètres de fichier statique

Parce que je reste bloqué dans les paramètres de fichier statique lors du déploiement Ajoutons les paramètres dans le fichier statique de config / settings.py comme suit.

settings.py


...#réduction

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

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

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

...#réduction

Créez ensuite un répertoire statique dans le répertoire racine de votre projet Créez-y un fichier vide avec le nom .gitkeep </ code>.

・ ・ ・

[Supplément] Raisons de l'ajout de .gitkeep </ code> Pour livrer des fichiers statiques avec Heroku Je dois créer un répertoire statique, Puisqu'un répertoire vide ne peut pas être géré par git, nous créons un fichier vide appelé .gitkeep. Il n'a pas besoin d'être nommé .gitkeep, Si vous voulez gérer un tel répertoire vide avec git, Il semble qu'il soit habituel de le nommer .gitkeep.

7. Séparation des paramètres d'environnement de développement et des paramètres d'environnement de production

Enfin, les contenus définis jusqu'à présent sont séparés entre l'environnement de développement et l'environnement de production. Ajoutez ce qui suit à la fin de config / settings.py.

settings.py


...
...
...#réduction

DEBUG = False

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

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

Dans django_heroku.settings (locals ()), django_heroku appliquera les paramètres pour Heroku.

Ensuite, créez un fichier de configuration pour l'environnement de développement qui ne sera pas déployé sur Heroku. Créez config / local_settings.py et enregistrez-le avec le contenu suivant.

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

Créez ensuite un fichier .gitignore directement sous le projet (le même répertoire que manage.py) et créez-le avec le contenu suivant.

.gitignore


staticfiles
config/local_settings.py
db.sqlite3

.gitignore est un fichier qui déclare les fichiers qui ne sont pas gérés par git. Le fichier config / local_settings.py décrit ici ne sera pas transmis à Heroku. En d'autres termes, il s'agit d'un paramètre pour l'environnement de développement qui ne se reflète pas dans l'environnement de production.

C'est la fin de la modification jusqu'au déploiement.

Déployer sur Heroku

Vous pouvez déployer en poussant avec git comme la commande suivante dans le terminal.

.gitignore


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

↓ ↓ Entrez le $ git push heroku master </ code> ci-dessus et si cela fonctionne, ce sera comme suit.

.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

Ensuite, effectuez la migration avec la commande suivante dans le terminal. La commande pipenv run python manage.py migrate qui a été effectuée dans l'environnement local L'image est que cela se fera même dans un environnement de production.

.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

Lorsque vous avez terminé, accédez à https: // Heroku appname.com/appname/ ! !!

Le déploiement est terminé.

J'ai eu une erreur lors du déploiement

3, Erreur lors de l'installation de django-heroku </ b> Entrez $ pipenv install django-heroku </ code> dans le terminal ... J'ai une très longue déclaration d'erreur. Il y avait la phrase suivante à la fin de la phrase d'erreur.

.gitignore


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

La solution

J'ai entré la commande suivante dans le terminal.

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

Erreur lors du déploiement d'Heroku </ b> Lorsque j'entre $ git push heroku master </ code> dans le terminal, l'erreur suivante se produit.

$ 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'.

La solution

Il a été résolu en générant requirements.txt. Lorsque j'ai entré la commande suivante dans le terminal et que j'ai poussé à nouveau vers Heroku, cela s'est passé sans problème.

pipenv lock -r > requirements.txt

c'est tout.

Recommended Posts