[PYTHON] Déploiement Heroku de la première application Django à laquelle les débutants sont accros

En raison de diverses courses, j'ai décidé de déployer l'application Django fabriquée localement sur Heroku, mais cela a pris beaucoup de temps, donc sous forme de mémorandum.

environnement

Qu'est-ce que Django

(Je pense que vous le savez quand vous lisez cet article ...) Django semble être un framework web qui tourne sur Python2 et 3 ... C'est "probable" parce que je ne suis pas familier avec les frameworks Web. Si vous êtes intéressé, veuillez vous référer au document officiel ...?

Référence: Document Django

Qu'est-ce que le déploiement

Transférer ce qui a été fait dans l'environnement local vers l'environnement de production réel ... Peut-être. Les applications Web comme Django n'étaient pas aussi faciles que de simplement télécharger un site Web ... Ci-dessous, je vais vous expliquer le déroulement général de ce déploiement.

Conditions préalables

Si vous n'avez pas encore appris Django, il y avait un bel article ici, alors apprenez d'ici ...! Explication de l'application Web Python (Django) d'une manière facile à comprendre même pour les débutants Master Django le plus rapide

Déployer

L'auteur qui a créé la première application Web utilisant Django. C'est gluant, ça bouge, c'est DB, ça bouge Un jour, un jour, il est enfin temps de le mettre en ligne ... (style histoire)

Situation initiale

DjangoApp/  ├ env/ (virtualenv)  ├ manage.py  ├ db.sqlite3 ├ Django App / (celle du début)  │ ├ wsgi.py  │ └ setting.py └ App / (corps de l'application)

Veille de déploiement

Après avoir étudié ce qui est nécessaire pour le déploiement, il a dit: "Mettez db.sqlite3 (corps de la base de données sqlite), * .pyc et env / et ci-dessous dans .gitignore." J'ai fait .gitignore docilement, supprimé le cache avec "git rm -r --cached." Et validé

Référence: Refléter les paramètres de [Qiita] .gitignore

La situation après la nuit précédente

DjangoApp/  ├ env/  ├ manage.py  ├ db.sqlite3  ├ DjangoApp/  │ ├ wsgi.py  │ └ setting.py  ├ App/  └ .gitignore (New)

Prêt à déployer

Lors du téléchargement d'un fichier sur Heroku, il semble que trois types de trésors sacrés, "Procfile (sans extension)", "requirements.txt" et "runtime.txt" sont nécessaires.

Procfile Il dit à Heroku que "Cette application devrait être lancée comme ça! ☆" Pour le moment, j'ai décidé de l'écrire exactement comme il a été écrit par diverses personnes.

Procfile


web: gunicorn DjangoApp.wsgi --log-file -

La partie Django App décrit le nom de votre application. Et il semble que je doive installer ce "gunicorn" et ainsi de suite dans virtualenv plus tard ... Mmm, cela prend beaucoup de temps et d'efforts ...

requirements.txt Vous devez contacter Heroku avec les modules nécessaires pour exécuter cette application. Requirements.txt est utilisé pour cela. (peut être) C'est facile. Après avoir démarré virtualenv avec une commande

CMD


pip freeze > requirements.txt 

Et c'est suffisant. Vous devriez avoir un fichier comme celui ci-dessous.

requirements.txt


Django==1.11.1
virtualenv==15.1.0

runtime.txt Il semble indiquer à Heroku la version de python que vous utilisez maintenant ... (je ne suis pas sûr)

CMD


python-2.7.x

La partie 2.7.x est basée sur la version de Python installée sur votre ordinateur.

Après avoir créé trois sortes de trésors sacrés

DjangoApp/  ├ env/  ├ manage.py  ├ db.sqlite3  ├ DjangoApp/  │ ├ wsgi.py  │ └ setting.py  ├ App/  ├ requirements.txt (New)  ├ runtime.txt (New)  ├ Procfile (New)  └ .gitignore

Installation de Django-toolbelt

Après enquête, il semble que divers modules supplémentaires soient nécessaires pour le déploiement ... Le gunicorn ci-dessus, djando-static pour la gestion des fichiers statiques, dj_database_url pour la gestion des bases de données, etc ... Je pense qu'il est difficile de gérer chacun d'eux. Quand j'étais là-bas, j'ai trouvé un allié qui pourrait les mettre ensemble! django-toolbelt ...!

CMD


pip install django-toolbelt

Installez la ceinture porte-outils comme. J'ai tous les modules nécessaires ...!

...... Si vous êtes une personne sage, vous devriez remarquer "ce type (rires)" ... Oui, le module installé par toolbelt à ce moment n'est pas écrit dans requirements.txt ... Je n'ai pas remarqué cela et cela a pris plus d'une demi-journée Également passé du temps ... Correctement, faisons à nouveau pip freeze à ce moment et mettons à jour requirements.txt! !!

requirements.txt après l'installation de toolbelt

requirements.txt


dj-database-url==0.4.2
dj-static==0.0.6
Django==1.11.1
django-toolbelt==0.0.1
gunicorn==19.7.1
psycopg2==2.7.3
pytz==2017.2
static3==0.7.0
virtualenv==15.1.0

Ça continue encore! Prêt à déployer!

Vient ensuite l'histoire de la base de données.

J'ai entendu dire que Heroku ne pouvait pas utiliser la base de données sqlite3 (je me demande si elle peut être installée ...?) Par conséquent, il est nécessaire d'utiliser le (?) Postgres fourni en standard avec Heroku ...

…… Et le dj-database-url pour ça! Ouvrez setting.py et recherchez la partie suivante.

setting.py


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

Réécrivez la description de ce DB comme suit

setting.py


if "COMPUTER-NAME" in hostname:
    #Environnement de débogage
    # DEBUG = True //J'ai également changé le mode de débogage ici
    DATABASES = {
        'default': {
            'ENGINE': 'django.db.backends.sqlite3',
            'NAME': os.path.join(BASE_DIR, 'db.sqlite3'),
        }
    }
    ALLOWED_HOSTS = [] #Je ne suis pas sûr, mais cela semble aussi important
else:
    #Environnement de production
    # DEBUG = False
    import dj_database_url
    db_from_env = dj_database_url.config()
    DATABASES = {
        'default': dj_database_url.config()
    }
    ALLOWED_HOSTS = ['*']

Cela utilisera sqlite3 dans l'environnement local et Postgres dans l'environnement Heroku. (Probablement) COMPUTER-NAME est le nom de votre appareil. (J'ai vu que je devais écrire local, mais cela n'a pas fonctionné dans mon environnement ...) De plus, si vous vous mettez (presque certainement) en colère contre "Vous n'avez pas de nom d'hôte, vous êtes stupide!", Ajoutez ce qui suit au début de setting.py.

setting.py


.
from socket import gethostname
hostname = gethostname()
.

Je ne comprends pas vraiment wsgi

Il est temps de toucher wsgi.py, que je n'ai pas touché dans l'environnement local ...! Je pense que c'est bon de jouer avec un peu comme ce qui suit

setting.py


import os
from dj_static import Cling
from django.core.wsgi import get_wsgi_application

os.environ.setdefault("DJANGO_SETTINGS_MODULE", "DjangoApp.settings")
application = Cling(get_wsgi_application())

Django App a son propre nom de projet. …… Après tout, qu'est-ce que wsgi.py (Solegawa Karanai)

Situation finale

DjangoApp/  ├ env/  ├ manage.py  ├ db.sqlite3  ├ DjangoApp/  │ ├ wsgi.py (modified)  │ └ setting.py (modified)  ├ App/  ├ requirements.txt  ├ runtime.txt  ├ Procfile  └ .gitignore

Déployez maintenant! Visez Heroku!

Maintenant que nous sommes prêts, lancez CMD et allez à Heroku!

CMD


git add .
git commit -am "Launching now!"

heroku login
> Enter your Heroku credentials.
> Email: [email protected]
> Password (hidden):
> Logged in as [email protected]

heroku create NAME
> https://NAME.herokuapp.com/ | https://git.heroku.com/NAME.git

git push heroku master
>Quelque chose de long

heroku run python manage.py migrate
>Les flux de commande habituels de migration

heroku open

Le dernier Heroku ouvert ouvrira l'application. (Dans mon cas, c'était la première erreur d'application ...) C'est tout! Le reste, c'est l'opération! !! Je vous remercie pour votre travail acharné! !! !! (fatigué

Impressions

Il est également possible d'écrire une impression à ce sujet, mais il était si difficile pour les débutants de penser: "Quel détour ... Vous ne pouvez pas le rendre plus intelligent?" ... (´; ω; `) En particulier, il y a peu de références pour la dernière (ver1.11) ... Après tout, je lisais le document officiel anglais (rires). Écartez-vous, le cercle de Django!

Bogues non résolus

Site de gestion de rupture

Déployé sur Heroku en toute sécurité ... je pensais, mais le site de gestion ...

無題.png

Il est cassé ... (´ ・ ω ・ `) Pour une raison quelconque, il ne lit pas le CSS ... J'ai ajouté ce qui suit à setting.py pour gérer les fichiers statiques, mais ... non ...!

setting.py


STATIC_URL = '/static/'

# Static asset configuration
STATIC_ROOT = 'staticfiles'

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

...... Eh bien, je vais le réparer patiemment!

Recommended Posts

Déploiement Heroku de la première application Django à laquelle les débutants sont accros
L'histoire selon laquelle la version de python 3.7.7 n'était pas adaptée à Heroku
Une petite histoire addictive avec les permissions du répertoire spécifié par expdp (pour les débutants)
Personnalisez librement le modèle. Changer le nom de la variable et le nom du champ du modèle de l'application Django / Django Rest Framework ~ Comment refléter le déploiement sur heroku Memo
Comment vérifier la version de Django
Déployer l'application Django sur Heroku [Partie 2]
Déployer l'application Django sur Heroku [Partie 1]
10 erreurs Python communes aux débutants
La première application Web créée par des débutants en Python
Sortie exclusive de l'application Django utilisant ngrok
Liste des liens que les débutants en apprentissage automatique apprennent
Je souhaite télécharger une application Django sur heroku
[Ansible] Exemple de playbook qui ajoute une chaîne de caractères à la première ligne du fichier
[Django] Essayons de clarifier la partie de Django qui était en quelque sorte à travers le test
Lorsque j'ai déployé l'application Django sur Heroku, j'ai obtenu le module introuvable: <nom-projet> .wsgi.
Le mur lors du passage du service Django de Python 2.7 à la série Python 3
Mémo de déploiement de Django × Postgresql sur Docker vers Heroku
Notes diverses sur le déploiement de l'application django sur Heroku
mémo de déploiement heroku (Django)
Résumé des points d'achoppement à Django pour la première fois
Accrocher à la première importation du module et imprimer le chemin du module
Essayez d'extraire les mots-clés populaires dans COTOHA
[Django] Une collection de scripts pratiques pour le développement
[Django] Un simple résumé de la fonction de sortie du journal afin que même les débutants puissent la comprendre.
L'histoire du retour au front pour la première fois en 5 ans et de la refactorisation de Python Django
[Premier développement personnel] L'histoire du déploiement de l'application Flask et du robot de réponse automatique de Twitter sur Heroku
L'histoire selon laquelle CSS n'est plus appliqué lorsque l'application Django est téléchargée de local vers AWS
Déployer le projet django sur heroku
Le record auquel j'étais accro en mettant MeCab dans Heroku
Extraire l'index de la set list d'origine correspondant à la liste des sous-ensembles.
[Python] Comment obtenir le premier et le dernier jour du mois
Premier python ② Essayez d'écrire du code tout en examinant les fonctionnalités de python
La première intelligence artificielle. Comment vérifier la version de Tensorflow installée.
Comment déployer une application Django sur heroku en seulement 5 minutes
Créez une application qui informe LINE de la météo tous les matins
Un script qui renvoie 0, 1 attaché au premier Python prime
Vérification de la théorie selon laquelle "Python et Swift sont assez similaires"
Les débutants en Python utilisent l'API non officielle de Google Play Music pour jouer de la musique
[python] Une note que j'ai commencé à comprendre le comportement de matplotlib.pyplot
[Python] Un programme qui fait pivoter le contenu de la liste vers la gauche
L'histoire de l'échec de la mise à jour de "calendar.day_abbr" sur l'écran d'administration de django
[Pour les débutants] Je veux obtenir l'index d'un élément qui satisfait une certaine expression conditionnelle
(Python) J'ai créé une application de Trello qui notifie périodiquement le relâchement des tâches sur le point d'expirer.
Django super introduction par les débutants Python! Partie 2 J'ai essayé d'utiliser les fonctions pratiques du modèle
[Pour les débutants chez AtCoder] Parlez de la quantité de calcul que vous voulez connaître approximativement
Raisons de penser que les caractères grecs de la formule devraient être utilisés comme noms de variables
Résumé des sites et des procédures d'apprentissage qui seront utiles pour ceux qui essaient de créer des jeux avec pygame pour la première fois