jeudi 29 septembre 2011

Python/Django on Heroku

Le service PaaS Heroku a lancé il y a peu de temps en beta publique sa nouvelle stack, Celadon Cedar.

Cette nouvelle plateforme se veut polyglotte, et donc, après Ruby on Rails, Node.js et Clojure, c'est maintenant Python et son framework phare django qui sont supportés!

Installation de heroku

$ gem install heroku

Application basique

On va écrire une application la plus simple possible, le but n'étant pas d'apprendre le python, donc un "hello world" fera parfaitement l'affaire.

requirements.txt
Flask==0.7.2

app.py
import os
from flask import Flask
app = Flask(__name__)

@app.route("/")
def hello():
    return "Hello from Python!"

if __name__ == "__main__":
    port = int(os.environ.get("PORT", 5000))
    app.run(host='0.0.0.0', port=port)

Déclaration des "process types" with Foreman/Procfile

Pour exécuter l'application, nous devons déclarer la commande à utiliser pour la lancer, donc simplement lancer notre script.

Dans le fichier Procfile :

web: python app.py

On peut donc maintenant lancer l'appli avec Foreman

$ gem install foreman
$ foreman start
14:39:04 web.1     | started with pid 24384
14:39:04 web.1     | Listening on 5000

L'application est donc accessible sur le port 5000.

Déploiement

Heroku nécessitant git, la première chose à faire est de versionner l'application :
$ git init
Initialized empty Git repository in .git/
$ git add .
$ git commit -m "new app"
Created initial commit 5df2d09: new app

Ensuite, il faut créer l'application Heroku sur la plateforme, via l'api en ligne de commande :
$ heroku create --stack cedar
Creating young-fire-2556... done, stack is cedar
http://young-fire-2556.herokuapp.com/ | git@heroku.com:young-fire-2556.git
Git remote heroku added

Une application appname vierge nous attend donc chez Heroku, il suffit de pousser notre application avec git pour la voir en ligne immédiatement :
 Heroku receiving push
-----> Python app detected
-----> Preparing virtualenv version 1.6.1
       New python executable in ./bin/python2.7
       Also creating executable in ./bin/python
       Installing setuptools............done.
       Installing pip...............done.
-----> Installing dependencies using pip version 1.0.1
       Downloading/unpacking Flask==0.7.2 (from -r requirements.txt (line 1))
       ...
       Successfully installed Flask Werkzeug Jinja2
       Cleaning up...
-----> Discovering process types
       Procfile declares types -> web
-----> Compiled slug size is 3.5MB
-----> Launching... done, v2
       http://young-fire-2556.herokuapp.com deployed to Heroku

To git@heroku.com:young-fire-2556.git
 * [new branch]      master -> master

Avant de voir notre application en ligne, il faut la scaler :
Before looking at the app on the web, we’ll need to scale the web process:

$ heroku ps:scale web=1
Scaling web processes... done, now running 1
Now, let’s check the state of the app’s processes:

$ heroku ps
Process       State               Command
------------  ------------------  --------------------------------------------
web.1         up for 10s          node web.js
The web process is up. Review the logs for more information:

$ heroku logs
2011-03-10T10:22:30-08:00 heroku[web.1]: State changed from created to starting
2011-03-10T10:22:32-08:00 heroku[web.1]: Running process with command: `node web.js`
2011-03-10T10:22:33-08:00 heroku[web.1]: Listening on 18320
2011-03-10T10:22:34-08:00 heroku[web.1]: State changed from starting to up

Tout est ok, notre app est accessible, on peut l'ouvrir via un simple heroku open.

Aucun commentaire:

Enregistrer un commentaire