Notes personnelles
J'ai fait un tutoriel Python pour Heroku. https://devcenter.heroku.com/articles/getting-started-with-python Je l'ai laissé comme mémo, mais je ne suis pas resté coincé, donc c'est devenu un mémo de commande plutôt qu'un savoir-faire.
Python s'exécute localement Il y a aussi virtualenv
brew intall postgresql
Set pour postgres
echo 'export PGDATA=/usr/local/var/postgres' >> ~/.zshrc #Dans chaque profil
Vous pouvez maintenant démarrer / arrêter avec pg_ctl start
ou pg_ctl stop
.
(Habituellement, c'est gênant car il est déroutant avec postgres -D / usr / local / var / postgres
)
Vérifier en entrant en tant qu'utilisateur postgres depuis le début ou en affichant la liste de la base de données
psql -l #Affichage DB
psql postgres #Connectez-vous en tant qu'utilisateur postgres(Lorsque vous quittez\q)
https://www.heroku.com/
brew install heroku-toolbelt
Puis connectez-vous à Heroku
$ heroku login
Enter your Heroku credentials.
Email: [email]
Password (typing will be hidden):
Logged in as [email]
Clonez l'exemple d'application.
git clone https://github.com/heroku/python-getting-started.git
$ cd python-getting-started
Si vous le pouvez, enregistrez l'application dans Heroku
$ heroku create
Creating morning-plateau-xxxx... done, stack is cedar-14
https://morning-plateau-xxxx.herokuapp.com/ | https://git.heroku.com/morning-plateau-xxxx.git
Git remote heroku added
L'application est enregistrée avec un nom approprié (morning-plateau-xxxx cette fois).
Si vous voulez lui donner un nom, mettez-le après create
. heroku create sanmple-name-app
À ce stade, remote est enregistré dans le git local avec le nom heroku.
Lorsque j'ai accédé à l'URL, cela ressemblait à une page initiale.
Ensuite, déployez l'exemple d'application
$ git push heroku master
Counting objects: 185, done.
Delta compression using up to 4 threads.
Compressing objects: 100% (91/91), done.
Writing objects: 100% (185/185), 30.52 KiB | 0 bytes/s, done.
Total 185 (delta 80), reused 185 (delta 80)
remote: Compressing source files... done.
remote: Building source:
remote:
remote: -----> Python app detected
remote: -----> Installing runtime (python-2.7.9)
remote: -----> Installing dependencies with pip
#Omis parce que c'est long
remote: -----> Compressing... done, 42.9MB
remote: -----> Launching... done, v4
remote: https://morning-plateau-xxxx.herokuapp.com/ deployed to Heroku
remote:
remote: Verifying deploy.... done.
Déploiement terminé. En regardant la sortie, vous pouvez voir qu'il ne s'agit pas seulement de pousser, mais en quelque sorte de construction d'environnement et d'exécution de commandes.
Démarrez le processus pour exécuter l'application avec la commande suivante. J'ai spécifié l'échelle 1, mais cela coûtera-t-il de l'argent pour l'augmenter? Pour le déplacer pour le moment, "Assurez-vous qu'au moins une instance de l'application est en cours d'exécution".
$ heroku ps:scale web=1
Scaling dynos... done, now running web at 1:Free.
Lorsque j'exécute la commande ps, cela semble certainement fonctionner.
$ heroku ps
=== web (Free): gunicorn gettingstarted.wsgi --log-file -
web.1: up 2016/01/06 02:36:49 (~ 8m ago)
Au fait, quand web = 2, c'est devenu comme ça. Hmm. (Regardez plus tard)
$ heroku ps:scale web=2
Scaling dynos... failed
! Cannot update to more than 1 Free size dynos per process type.
Enfin, ouvrez l'application ci-dessous
heroku open
Facile. À ce stade, la page s'ouvre.
heroku logs
heroku logs --tail #Peut être vu dans la queue
Procfile?
Dans un fichier texte du répertoire racine de l'application, écrivez les commandes nécessaires pour lancer l'application. Le Procfile de l'exemple d'application Python était le suivant.
web: gunicorn gettingstarted.wsgi --log-file -
web
est le type de processus, suivi de la commande.
Lorsqu'il est démarré normalement, le processus s'exécute avec un dyno.
(Qu'est-ce que dyno? Voici un conteneur léger qui exécute les commandes Procfile)
Si vous voulez le faire correctement, heroku ps
.
Par défaut, un dyno est gratuit et s'il n'y a pas d'accès pendant 30 minutes ou si vous vous déplacez pendant 18 heures ou plus par jour, vous passerez en mode veille. Si c'est dans les 18 heures, il démarrera à chaque fois qu'un accès arrive, mais après le sommeil, il démarrera, donc ce sera un peu lourd. Si vous ne voulez pas dormir ou si vous voulez faire une mise à l'échelle, passez à Professionnel.
Si requirements.txt se trouve dans le répertoire racine, Heroku semble le reconnaître comme une application python. Le contenu de requirements.txt de l'exemple d'application est le suivant.
$ cat requirements.txt
dj-database-url==0.3.0
Django==1.8.1
django-postgrespool==0.3.0
gunicorn==19.3.0
psycopg2==2.6
SQLAlchemy==1.0.4
whitenoise==1.0.6
Heroku installe les bibliothèques nécessaires sur cette base, bien qu'elle soit légèrement différente de celle du didacticiel.
Comme vous le savez, c'est le même format que pip freeze
.
Puisqu'il s'agit d'un exemple d'application que j'ai téléchargé, je vais créer le même environnement localement pour le moment.
La version de python est écrite dans runtime.txt
dans le répertoire racine.
(Parce que j'utilisais pyenv, j'ai créé un environnement avec.)
$ cat runtime.txt
python-2.7.9
$ pyenv install 2.7.9
$ pyenv virtualenv 2.7.9 sample-app
$ cd [workspace]
$ pyenv local sample-app
$ pip install -r requirements.txt --allow-all-external
Ce que vous exécutez sur heroku fonctionne localement.
$ python manage.py collectstatic #Collectez les fichiers statiques de votre projet en un seul endroit
$ heroku local web
Accédez à http: // localhost: 5000 / et confirmez qu'il fonctionne.
Le flux de changer le local de manière appropriée et de pousser à heroku. J'importe les demandes, j'apporte des modifications pour ignorer les demandes vers le site approprié et j'affiche la réponse, et je pousse.
Tout d'abord, ajoutez ce qui suit à requirements.txt
.
requests==2.3.0
Ajoutez ce qui suit au début de hello / views.py
et
import requests
Réécrivez la fonction appelée index comme suit
def index(request):
r = requests.get('http://httpbin.org/status/418')
print r.text
return HttpResponse('<pre>' + r.text + '</pre>')
Exécutez localement
$ pip install -r requirements.txt --allow-all-external
$ heroku local
Quand je vais sur http: // localhost: 5000 /, le contenu de http://httpbin.org/status/418 est trouvé.
-=[ teapot ]=-
_...._
.' _ _ `.
| ."` ^ `". _,
\_;`"---"`|//
| ;/
\_ _/
`"""`
mignonne.
Puisqu'il a changé en toute sécurité, je vais le refléter dans heroku.
$ git add .
$ git commit -m "Demo"
$ git push heroku masterg
$ heroku open
Déploiement terminé, la même page de théière s'ouvre. Le déploiement sur heroku est essentiellement ce flux.
À titre d'exemple, ajoutez une trace papier.
$ heroku addons:create papertrail
! Please verify your account to install this add-on plan (please enter a credit card) For more information, see https://devcenter.heroku.com/categories/billing Verify now at https://heroku.com/verify
J'ai été grondé. L'addon semble avoir vérifié pour éviter les abus. J'avais peur d'enregistrer les informations Creca et de réessayer.
$ heroku addons:create papertrail
Creating papertrail-rigid-xxxx... done, (free)
Adding papertrail-rigid-xxxx to morning-plateau-xxxx... done
Setting PAPERTRAIL_API_TOKEN and restarting morning-plateau-xxxx... done, v6
Welcome to Papertrail. Questions and ideas are welcome ([email protected]). Happy logging!
Use `heroku addons:docs papertrail` to view documentation.
Maintenant déployé. Vous pouvez voir la liste actuelle des modules complémentaires avec la commande suivante.
$ heroku addons
Add-on Plan Price
───────────────────────────────────────────── ───────── ─────
heroku-postgresql (postgresql-octagonal-xxxx) hobby-dev free
└─ as DATABASE
papertrail (papertrail-rigid-xxxx) choklad free
└─ as PAPERTRAIL
The table above shows add-ons and the attachments to the current app (morning-plateau-xxxx) or other apps.
Jetez un œil à papertrail
heroku addons:open papertrail
Le navigateur s'ouvre et vous pouvez consulter le journal.
Vous pouvez utiliser la console heroku avec la commande heroku run COMMAND
.
Ici, la commande semble s'exécuter sur un dyno temporaire appelé dyno unique.
$ heroku run pwd
Running pwd on morning-plateau-xxxx... up, run.5945
/app
$ heroku run python manage.py shell
Running python manage.py shell on morning-plateau-xxxx... up, run.4047
Python 2.7.9 (default, Dec 11 2014, 17:18:51)
[GCC 4.8.2] on linux2
Type "help", "copyright", "credits" or "license" for more information.
(InteractiveConsole)
>>> import requests
>>> print requests.get('http://httpbin.org/status/418').text
-=[ teapot ]=-
_...._
.' _ _ `.
| ."` ^ `". _,
\_;`"---"`|//
| ;/
\_ _/
`"""`
De même, vous pouvez exécuter le bash de dyno ci-dessous.
$ heroku run bash
Running bash on morning-plateau-xxxx... up, run.3252
$ ls
app.json gettingstarted hello manage.py Procfile Procfile.windows README.md requirements.txt runtime.txt staticfiles
$ exit
exit
Définition des variables et des ressources externes telles que la clé secrète que vous souhaitez placer en externe
Au moment de l'exécution, les variables de configuration vont dans les variables d'environnement.
Ajoutez ce qui suit au début de hello / view.py
.
import os
De plus, réécrivez «index» comme suit
def index(request):
times = int(os.environ.get('TIMES',3))
return HttpResponse('Hello! ' * times)
Ajoutez ce qui suit au fichier .env local. Regardez ici et les variables d'environnement sont définies.
TIMES=2
Vous pouvez également définir des variables de configuration sur Heroku avec heroku config: set
. Vous pouvez également le vérifier avec heroku config
.
$ heroku config:set TIMES=2
Setting config vars and restarting morning-plateau-xxxx... done
TIMES: 2
$ heroku config
=== morning-plateau-xxxx Config Vars
DATABASE_URL: xxxx
PAPERTRAIL_API_TOKEN: xxxx
TIMES: 2
Diverses bases de données sont également préparées par addon. Puisqu'il s'agit d'un addon, vous pouvez vérifier l'actuel avec heroku addons
.
Vous pouvez voir que l'URL de la base de données de destination de la connexion est enregistrée dans DATABASE_URL
de heroku config
.
heroku config
=== morning-plateau-xxxx Config Vars
DATABASE_URL: postgres://~~~ #Abréviation
De plus, la commande heroku pg
donne des détails.
$ heroku pg
=== DATABASE_URL
Plan: Hobby-dev
Status: Available
Connections: 0/20
PG Version: 9.4.4
Created: 2016-01-05 17:36 UTC
Data Size: 6.4 MB
Tables: 0
Rows: 0/10000 (In compliance)
Fork/Follow: Unsupported
Rollback: Unsupported
Add-on: postgresql-octagonal-xxxx
La base de données est déjà activée dans l'exemple de projet, et vous pouvez y accéder en ajoutant / db
à la fin de l'URL, mais dans l'état actuel, la table n'a pas encore été créée, donc une erreur se produira si vous y accédez.
Exécutez manage.py migrate
dans Heroku pour créer une table dans django.
$ heroku run python manage.py migrate
Running python manage.py migrate on morning-plateau-xxxx... up, run.6683
Operations to perform:
Synchronize unmigrated apps: messages, hello, staticfiles
Apply all migrations: admin, sessions, auth, contenttypes
# ...
#Abréviation
Si vous visitez à nouveau ʻURL + / db`, vous verrez une page simple avec plus d'enregistrements chaque fois que vous visitez, cette fois au lieu d'une erreur.
Les modèles de base de données sont dans «hello / models.py» et les paramètres sont dans «gettingstarted / settings.py». (Je n'expliquerai pas sur django)
Si vous avez postgresql localement, vous pouvez accéder à la base de données de heroku à partir du répertoire racine de votre projet avec:
$ heroku pg:psql
---> Connecting to DATABASE_URL
psql (9.4.5, server 9.4.4)
Type "help" for help.
morning-plateau-xxxx::DATABASE=> select * from hello_greeting;
id | when
----+-------------------------------
1 | 2016-01-11 16:09:35.860529+00
2 | 2016-01-11 16:10:28.385479+00
(2 rows)
Pour plus d'informations sur Heroku Postgres, voir https://devcenter.heroku.com/articles/heroku-postgresql.
C'est la fin du tutoriel. Enfin, deux liens sont fournis à l'étape suivante.
Recommended Posts