Python - herokaijp/devcenter GitHub Wiki
ãã®ãã¥ãŒããªã¢ã«ã¯Herokuã«ãããã€ããããFlaskWebãã¬ãŒã ã¯ãŒã¯ã䜿ã£ãPythonã¢ããªã±ãŒã·ã§ã³ã«ã€ããŠæ±ã£ãŠè¡ããŸããDjangoã¢ããªã±ãŒã·ã§ã³ã«ã€ããŠã¯ãGetting Started with Django on Herokuã確èªããŠãã ãããHerokuã䜿ã£ãã¢ããªã±ãŒã·ã§ã³ã®éçºãèšèšã®ä»æ¹ã«é¢ããäžè¬çãªæ å ±ã¯ãArchitecting Applications for Herokuã確èªããŠãã ããã
- åºæ¬çãªPythonã®ç¥èã
- ã€ã³ã¹ããŒã«ãããŠããPythonãšVirtualenvãããããªãå Žåã¯ãã®ã¬ã€ãã確èªããŠãã ããã
- ã¢ããªã±ãŒã·ã§ã³ã¯ãäŸåãã¡ã€ã«ã管çããããã«Pipã䜿ããŸãã
- Herokuã®ãŠãŒã¶ã¢ã«ãŠã³ãããã¡ãã§ç¡æã§ç°¡åã«ååŸãã§ããŸãã
å§ãã«ãHeroku ToolbeltãããŒã«ã«ã«ã€ã³ã¹ããŒã« ããŸããããã¯ããªãã®Heroku command-line clientãForemanããããŠGitã®ããŒãžã§ã³ç®¡çã·ã¹ãã ãžã¢ã¯ã»ã¹ã確ããªãã®ã«ããŸãã
äžåºŠã€ã³ã¹ããŒã«ã§ãããšãheroku
ã³ãã³ããã·ã§ã«ãã䜿ããããã«ãªããŸããã¢ã«ãŠã³ããäœã£ããšãã«äœ¿ã£ãE-mailã¢ãã¬ã¹ããã¹ã¯ãŒãã䜿ã£ãŠãã°ã€ã³ããŠã¿ãŸã :
:::term
$ heroku login
Enter your Heroku credentials.
Email: [email protected]
Password:
Could not find an existing public key.
Would you like to generate one? [Yn]
Generating new SSH public key.
Uploading ssh public key /Users/kenneth/.ssh/id_rsa.pub
ãšã³ã¿ãŒããŒããããšããã«ååšããŠããssh
ããŒãæ°ãããã®ãã¢ããããŒãããŠãããŸããåŸã§ã³ãŒããããã·ã¥ãããšãã«äœ¿ããŸãã
å§ãã«ãç§ãã¡ã®ãããžã§ã¯ãã®ããã«ã空ã®ãããã¬ãã«ãã£ã¬ã¯ããªãäœããŸã :
:::term
$ mkdir helloflask
$ cd helloflask
次ã«Python Virtualenv(v0.7)ãäœããŸã :
:::term
$ virtualenv venv --distribute
New python executable in venv/bin/python
Installing distribute...............done.
Installing pip...............done.
æ°ããvirtualenvãäœãããã«ããããã¢ã¯ãã£ããŒãããå¿ èŠããããŸãã(ããªãã®ã¢ããªã±ãŒã·ã§ã³ãå®è¡ããããšæã£ãŠããããããã®ã¿ãŒããã«ã®ã»ãã·ã§ã³ããšã«ãwirtualenvã®ç°å¢ãçšæããå¿ èŠããããŸã)
:::term
$ source venv/bin/activate
次ã«ãç§ãã¡ã®ã¢ããªã±ãŒã·ã§ã³ã®äŸåãã¡ã€ã«ãpipã䜿ã£ãŠã€ã³ã¹ããŒã«ããŸããä»åã¯ãWebãã¬ãŒã ã¯ãŒã¯ã§ããFlaskãšWebãµãŒãã§ããGunicornãã€ã³ã¹ããŒã«ããŸãã
:::term
$ pip install Flask gunicorn
Downloading/unpacking Flask
Downloading Flask-0.9.tar.gz (481kB): 481kB downloaded
Downloading/unpacking gunicorn
Downloading gunicorn-0.17.2.tar.gz (360kB): 360kB downloaded
Running setup.py egg_info for package gunicorn
Downloading/unpacking Werkzeug>=0.7 (from Flask)
Downloading Werkzeug-0.8.3.tar.gz (1.1MB): 1.1MB downloaded
Downloading/unpacking Jinja2>=2.4 (from Flask)
Downloading Jinja2-2.6.tar.gz (389kB): 389kB downloaded
Installing collected packages: Flask, gunicorn, Werkzeug, Jinja2
Running setup.py install for Flask
Running setup.py install for gunicorn
Running setup.py install for Werkzeug
Running setup.py install for Jinja2
Successfully installed Flask gunicorn Werkzeug Jinja2
ããã§ãäœæ¥ãããããã®ãŸã£ãããªFlaskç°å¢ãæã«å
¥ããŸãããã·ã³ãã«ãªã¢ããªã±ãŒã·ã§ã³ãhello.py
ãäœããŸããã :
:::python
import os
from flask import Flask
app = Flask(__name__)
@app.route('/')
def hello():
return 'Hello World!'
ã¢ããªã±ãŒã·ã§ã³ã®ã«ãŒããã£ã¬ã¯ããªã«ããããã¹ããã¡ã€ã«ã§ããProcfileã䜿ã£ãŠãWeb Dynoãéå§ãããããã«äœã®ã³ãã³ããå®è¡ããã¹ãããæç€ºçã«å®£èšããŸãããã®å Žåã¯ãGunicornãããã€ãã®åŒæ°ãšå ±ã«ãå®è¡ããå¿ èŠããããŸãã
ããã¯ç§ãã¡ã®ã¢ããªã±ãŒã·ã§ã³ã®ããã®Procfile
ã§ããããã¯Procfile
ãšããååã§ããããžã§ã¯ãã®ã«ãŒããã£ã¬ã¯ããªã«ååšããŠããå¿
èŠããããŸãã
:::term
web: gunicorn hello:app
ããã§Foreman ã䜿ã£ãŠãããŒã«ã«ã§Procfileã䜿ãäºãåºæ¥ãããã«ãªããŸããã(Toolbeltã®äžéšãšããŠã€ã³ã¹ããŒã«ãããŠããŸã) :
:::term
$ foreman start
2013-04-03 16:11:22 [8469] [INFO] Starting gunicorn 0.14.6
2013-04-03 16:11:22 [8469] [INFO] Listening at: http://127.0.0.1:8000 (8469)
curl
ããã©ãŠã¶ã§é©åã«åããŠãããã確èªããäžã§ãCtrl-Cã§çµäºããŸãã
Herokuã¯Pythonã¢ããªã±ãŒã·ã§ã³ããªããžããªã®ã«ãŒããã£ã¬ã¯ããªã«ããrequirements.txt
ãã¡ã€ã«ã«ãã£ãŠå€æããŸãããã®ã·ã³ãã«ãªãã©ãŒãããã¯ã»ãšãã©ã®Pythonã®ãããžã§ã¯ãã«çœ®ããŠãã¢ããªã±ãŒã·ã§ã³ãå¿
èŠãšããŠããå€éšã®Pythonã¢ãžã¥ãŒã«ãæç€ºããããã«äœ¿ãããŸãã
Pipã¯pip freeze
ãšãããç§ãã¡ã®ããã®ãã®ãã¡ã€ã«ãçæããŠãããçŽ æµãªã³ãã³ããæã£ãŠããŸã :
:::term
$ pip freeze > requirements.txt
Flask==0.9
Jinja2==2.6
Werkzeug==0.8.3
gunicorn==0.17.2
Pipã¯ãŸããé²ãã äŸåãã¡ã€ã«ç®¡çã«ã䜿ãããŸããPipã䜿ã£ãPythonã®äŸåãã¡ã€ã«ãã¿ãŠãæŽã«åŠç¿ããŠã¿ãŠãã ããã
ã¢ããªã±ãŒã·ã§ã³ãæžãçµããããã¹ããå®äºããŠããä»ãç§ãã¡ã¯Gitã®ãªããžããªã«ãã®ãããžã§ã¯ããæ ŒçŽããå¿ èŠããããŸãã
çŸåšã®ãã£ã¬ã¯ããªã«ã¯äœåãªãã¡ã€ã«ãããããå«ãŸããŠããããã.gitignore
ãã¡ã€ã«ãã€ãã£ãŠãããã®ãã¡ã€ã«ãç¡èŠããããã«ãªããžããªãèšå®ããããšæããŸã :
venv
*.pyc
次ã«ãæ°ããGitãªããžããªãäœããç§ãã¡ã®å€æŽãä¿åããŸãã
:::term
$ git init
$ git add .
$ git commit -m "init"
次ã®ã¹ãããã¯ã¢ããªã±ãŒã·ã§ã³ã®ãªããžããªãHerokuã«ããã·ã¥ããããšã§ããå§ãã«ãç§ãã¡ã¯Herokuã«ããã·ã¥ããå Žæãçšæããå¿
èŠããããŸããheroku create
ã³ãã³ãã§ãããå¯èœã§ã :
:::term
$ heroku create
Creating stark-window-524... done, stack is cedar
http://stark-window-524.herokuapp.com/ | [email protected]:stark-window-524.git
Git remote heroku added
ããã¯èªåçã«ç§ãã¡ã®ã¢ããªã±ãŒã·ã§ã³ã®ããã®Herokuã®ãªã¢ãŒã([email protected]:stark-window-524.git
)ãç§ãã¡ã®ãªããžããªã«è¿œå ããŠãããŸããä»ç§ãã¡ã¯ãã¢ããªã±ãŒã·ã§ã³ããããã€ããããã«ãã·ã³ãã«ã§ããgit push
ãå©ãããšãã§ããŸãã
:::term
$ git push heroku master
Counting objects: 10, done.
Delta compression using up to 8 threads.
Compressing objects: 100% (8/8), done.
Writing objects: 100% (10/10), 3.59 KiB, done.
Total 10 (delta 0), reused 0 (delta 0)
-----> Heroku receiving push
-----> Python app detected
-----> No runtime.txt provided; assuming python-2.7.4.
-----> Preparing Python runtime (python-2.7.4)
-----> Installing Distribute (0.6.36)
-----> Installing Pip (1.3.1)
-----> Installing dependencies using Pip (1.3.1)
...
Successfully installed Flask Werkzeug Jinja2 gunicorn
Cleaning up...
-----> Discovering process types
Procfile declares types -> web
-----> Compiled slug size is 3.5MB
-----> Launching... done, v2
http://stark-window-524.herokuapp.com deployed to Heroku
To [email protected]:stark-window-524.git
* [new branch] master -> master
ããªãã¯Herokuãžã®ã³ãŒãã®ãããã€ãå®äºããProcfile
ã䜿ã£ãŠããã»ã¹ã¿ã€ãã®æå®ãæžãã§ããç¶æ
ã§ããããã§ãHerokuã«å¯ŸããŠããã»ã¹ã¿ã€ããå®è¡ããããã«æç€ºãã ãããšãã§ããŸããHerokuã¯ãããããããã«ãDynoã®äžã®é¢é£ããã³ãã³ããèµ°ãããŸããDynoãšã¯Herokuã®æ§æç©ã®åºæ¬åäœã§ãã軜éã³ã³ããã®ããšã§ãã
web
ããã»ã¹ã¿ã€ãã®å®è¡äžã®Dynoãããããšã確ãããŠã¿ãŸããã :
:::term
$ heroku ps:scale web=1
Scaling web processes... done, now running 1
ã¢ããªã±ãŒã·ã§ã³ã®Dynoã®ç¶æ
ã確èªããããšãã§ããŸããheroku ps
ã³ãã³ãã¯å®è¡äžã®ããªãã®ã¢ããªã±ãŒã·ã§ã³ã®Dynoã®äžèЧã衚瀺ããŸã :
:::term
$ heroku ps
=== web: `gunicorn hello:app`
web.1: up for 5s
ããã§ã¯ãïŒåã®Dynoãå®è¡äžã§ãã
heroku open
ã䜿ããšãã©ãŠã¶ããã¢ããªã±ãŒã·ã§ã³ãžèšªåããããšãã§ããŸãã
:::term
$ heroku open
Opening stark-window-524... done
å®è¡äžã®Web DynoãïŒåã®ãããªãå ŽåãDynoã¯éã¢ã¯ãã£ãç¶æ ããïŒæéçµã€ãšã¹ãªãŒãã«å ¥ãããšããŸããããã¯åŸ©åž°æã®æåã®ãªã¯ãšã¹ãã®æ°ç§éã®é å»¶ãåŒãèµ·ãããŸããåŸç¶ã®ãªã¯ãšã¹ãã¯éåžžéãåããŸãã
ãããé¿ããããã«ãWeb DynoãïŒå以äžã«æ¡åŒµããããšãã§ããŸããäŸãã°ä»¥äžã®ããã«ããŸã :
:::term
$ heroku ps:scale web=2
ããããã®ã¢ããªã±ãŒã·ã§ã³ããšã«ãHerokuã¯750æéã®Dynoç¡æå©çšæéãæäŸããŠããŸããïŒåã®Dynoã§ã¢ããªãå®è¡ãã€ã¥ãããšããã®ææ¬¡ã®ç¡æç¯å²ãè¶ ããŠããŸãã®ã§ãæ¡åŒµãããã®ãæ»ããŠã¿ãŸããã :
:::term
$ heroku ps:scale web=1
Herokuã¯ããã°ãããªãã®ã¢ããªã±ãŒã·ã§ã³ã®æ§æç©ãå®è¡ããŠãããã¹ãŠã®Dynoã®åºåããéããããæç³»åã«ãªããã ã€ãã³ãã®åºåãšããŠæ±ããŸããHerokuã®Logplexã¯ãããã®å šãŠã®ã€ãã³ãã®ããã®åäœã®ãã£ã³ãã«ãæäŸããŸãã
ããªãã®å®è¡äžã®ã¢ããªã±ãŒã·ã§ã³ã«é¢ããæ
å ±ããlogging commandsã®äžã€ã§ãã heroku logs
ã䜿ã£ãŠã¿ãŠã¿ãŸããã :
:::term
$ heroku logs
2011-08-20T16:33:39+00:00 heroku[slugc]: Slug compilation started
2011-08-20T16:34:07+00:00 heroku[api]: Config add PYTHONUNBUFFERED by [email protected]
2011-08-20T16:34:07+00:00 heroku[api]: Release v1 created by [email protected]
2011-08-20T16:34:07+00:00 heroku[api]: Deploy 67b7e54 by [email protected]
2011-08-20T16:34:07+00:00 heroku[api]: Release v2 created by [email protected]
2011-08-20T16:34:08+00:00 heroku[web.1]: State changed from created to starting
2011-08-20T16:34:08+00:00 heroku[slugc]: Slug compilation finished
2011-08-20T16:34:10+00:00 heroku[web.1]: Starting process with command `gunicorn hello:app`
2011-08-20T16:34:10+00:00 app[web.1]: * Running on http://0.0.0.0:17658/
2011-08-20T16:34:11+00:00 heroku[web.1]: State changed from starting to up
Herokuã§ã¯ãå¿
èŠãªæã«ã¹ã¯ãªãããšãã®ããã ãã«å®è¡ãããã¢ããªã±ãŒã·ã§ã³ã§ããone-off dynoã®äžã§ãheroku run
ã䜿ã£ãŠãã³ãã³ããå®è¡ããããšãå¯èœã§ãã ããªãã®ã¢ããªã±ãŒã·ã§ã³ã®ç°å¢ã®äžã§å®éšã®ããã«ãããŒã«ã«ã®ã¿ãŒããã«ã§Pythonã·ã§ã«ãå®è¡ããããã«ããã䜿ããŸãã
:::term
$ heroku run python
Running python attached to terminal... up, run.1
Python 2.7.4 (default, Apr 6 2013, 22:14:13)
[GCC 4.4.3] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>>
ããããããã€ãã®ããªãã®ã¢ããªã±ãŒã·ã§ã³ã®ã¢ãžã¥ãŒã«ãimport
ããããšãã§ããŸãã
Procfile
ã®ãã©ãŒãããã§ã¯ãç°ãªã£ãããã»ã¹ã¿ã€ããããã€ã§ãå®è¡ããããšãã§ããŸããäŸãã°ãããªãã®Webããã»ã¹ãè£å©ããWorkerããã»ã¹ãã»ãããšå®£èšããŠã¿ãŸããã :
web: gunicorn hello:app
worker: python worker.py
ãã®å€æŽãHerokuã«PushããWorkerãèµ·åããŸã :
:::term
$ heroku ps:scale worker=1
Scaling worker processes... done, now running 1
Workerãåãå§ããããšãheroku ps
ã§ããŸãWorkerãåããŠããããšãheroku logs
ã§ç¢ºãããŠã¿ãŠãã ããã
- Pythonã¢ããªã±ãŒã·ã§ã³ã®éçºãšãããã€ã«ã€ããŠæŽã«åŠã¶ããã«ãPythonã«ããŽãªãžèšªåããã
- Pipãçµç±ããPythonã®äŸåãã¡ã€ã« ãš Pythonã®å®è¡ç³»ã®æç€º ã«ã€ããŠåŠã¶ã
- RQã䜿ã£ãPythonã®ããã¯ã°ã©ãŠã³ãã¿ã¹ã¯ã§ã¢ããªã±ãŒã·ã§ã³ã®èšèšãæ¡åŒµããã
- Herokuã§Djangoã䜿ã£ãéçºã®å§ãæ¹ãåŠã¶ã
- ã¢ããªã±ãŒã·ã§ã³ãæžããããæ§æãããããããã€ããããå®è¡ããæã«çŽé¢ããã ããæŠå¿µã«ã€ããŠãæè¡çãªå€§æ ãç¥ãããå Žåã¯Herokuã®ä»çµã¿ãèªãã