J'utilise les services offerts par Alwaysdata depuis plus de deux ans maintenant. J'y ai deployé des applis Rails, Django. Cette fois, j'ai voulu m'essayer à du Python une nouvelle fois, mais par l'intermédiaire de Flask. Ce ne fut pas si facile que cela. Pour votre informationm je suis totalement débutant en tout ce qui concerne déploiement et administration système (malgré le fait d'être un utilisateur Linux quotidien). Je fus découragé rapidement devant le manque de documentation concernant le déploiement d'une appli flask sur alwaysdata. C'est pourquoi j'ai décidé d'écrire cet article qui va vous tenter de vous guider pas à pas.
- installation de python (2.7.5)
- installation de setuptools et pip
- installation de virtualenv
- installation de flask et des librairies requises par votre application.
- créaction de votre fichier .wsgi
- problèmes rencontrés
jeremydagorn@ssh:~ $ cd
jeremydagorn@ssh:~ $ mkdir python
jeremydagorn@ssh:~ $ cd python
jeremydagorn@ssh:~/python $ mkdir src
jeremydagorn@ssh:~/python $ cd src
On crée ici la structure de fichiers qui acceuillera les fichiers sources de notre version de python:
jeremydagorn@ssh:~/python/src $ wget http://www.python.org/ftp/python/2.7.5/Python-2.7.5.tgz
jeremydagorn@ssh:~/python/src $ tar xvfz Python-2.7.5.tgz
jeremydagorn@ssh:~/python/src $ cd Python-2.7.5
Extraction des fichiers et installation:
jeremydagorn@ssh:~/python/src/Python-2.7.5 $ mkdir ~/python/python27
jeremydagorn@ssh:~/python/src/Python-2.7.5 $ ./configure --prefix=~/python/python27
jeremydagorn@ssh:~/python/src/Python-2.7.5 $ make
jeremydagorn@ssh:~/python/src/Python-2.7.5 $ make install
Vous piouvez bien sûr nommer python27
comme vous le souhaitez. Faites juste attention pour la suite de ce guide.
La prochaine étape est de permettre au systéme de reconnaître votre version de python comme étant la version par défaut. Pour cela, déclarez ceci dans votre .bash_profile
.
jeremydagorn@ssh:~/python/src $ echo "export PATH=$HOME/python/python27/bin:$PATH" >> ~/.bash_profile
jeremydagorn@ssh:~/python/src $ source ~/.bash_profile
Pour vérifier que votre version est celle par défaut:
jeremydagorn@ssh:~/python/src $ which python
Si tout a bien fonctionné vous devriez voir quelque chose de similaire:
jeremydagorn@ssh:/home/jeremydagorn/python/python27/bin/python
Vérifiez que vous vous situez toujours dans le répertoire python/src/
jeremydagorn@ssh:~/python/src $ wget https://pypi.python.org/packages/source/s/setuptools/setuptools-1.1.6.tar.gz --no-check-certificate
jeremydagorn@ssh:~/python/src $ tar xvfz setuptools-1.1.6.tar.gz
jeremydagorn@ssh:~/python/src $ cd setuptools-1.1.6
jeremydagorn@ssh:~/python/src/setuptools-1.1.6 $ python setup.py install
jeremydagorn@ssh:~/python/src/setuptools-1.1.6 $ cd ..
jeremydagorn@ssh:~/python/src $ wget https://pypi.python.org/packages/source/p/pip/pip-1.4.tar.gz --no-check-certificate
jeremydagorn@ssh:~/python/src $ tar xvfz pip-1.4.tar.gz
jeremydagorn@ssh:~/python/src $ cd pip-1.4
jeremydagorn@ssh:~/python/src/pip-1.4 $ python setup.py install
Rien d'extraordinaire ici, on télécharge et extrait les fichiers sources et on installe (comme exprimé dans le titre de la section)
Maintenant que pip
est installé, installer virtualenv
et virtualenvwrapper
est un jeu d'enfant.
jeremydagorn@ssh:~ $ pip install virtualenv
jeremydagorn@ssh:~ $ pip install virtualenvwrapper
Création du dossier qui contiendra nos différents virtualenvs sur notre espace de travail:
jeremydagorn@ssh:~ $ cd
jeremydagorn@ssh:~ $ mkdir .virtualenvs
jeremydagorn@ssh:~ $ echo ". /home/jeremydagorn/python/python27/bin/virtualenvwrapper.sh" >> .bash_profile
jeremydagorn@ssh:~ $ source .bash_profile
jeremydagorn@ssh:~ $ mkvirtualenv env
Une fois de plus, vous pouvez nommer votre virtualenv comme vous le souhaitez.
J'assume ici que vous avez copier/cloner le répertoire contenant le code de votre application sur votre espace de travail.
Allez vous situer dans le répertoire de votre application:
jeremydagorn@ssh:~$ cd www/jeremydagorn-blog/
jeremydagorn@ssh:~/www/jeremydagorn-blog$ ls
authentication.py base.pyc database.py installation.py models.py posts.py README.md static update-virtualenv.sh
authentication.pyc config.pyc forms.py jdblog.db models.pyc posts.pyc requirements.txt templates wtfcustomwidgets.py
base.py config.py.local forms.pyc jdblog.wsgi posts Procfile schema.sql test_base.py wtfcustomwidgets.pyc
Si vous avez un fichier requirements.txt contenant toutes vos dépendances ou quelque chose de similaire, exécutez simplement:
jeremydagorn@ssh:~ $ pip install -r requirements.txt
This will install all the dependencies using pip. To be able to create this kind of file, just run:
Cette commande va se charger d'installer toutes les dépendances listées dans votre fichier. Pour créer un tel fichier, rien de plus simple:
pip freeze > file_which_will_contain_dependencies_name
Pour être capable de démarrer votre application, vous avez besoin de créer un fichier .wsgi. Ce fichier doit simplement se charger d'importer l'instance de votre application:
from base import app as application
Il s'agit du fichier base.py
dans mon cas. Ce fichier contient la méthode main()
de mon programme
Vous avez également besoin de réferer l'emplacement de votre virtualenv, pour pouvoir le démarrer avant de démarrer votre application, et ainsi avoir accès à toutes les librairies/dépendances installées dans celui-ci.
De plus, il est nécessaire de donner l'emplacement du dossier contenant vos modules python. Vous pouvez utiliser la méthode addsitedir()
du module python site
Vous allez alors avoir un fichier dans le contenu est proche de celui-ci:
import os
import sys
import site
ALLDIRS = ['/home/jeremydagorn/.virtualenvs/env7/lib/python2.7/site-packages']
# Remember original sys.path.
prev_sys_path = list(sys.path)
# Add each new site-packages directory.
for directory in ALLDIRS:
site.addsitedir(directory)
# Reorder sys.path so new directories at the front.
new_sys_path = []
for item in list(sys.path):
if item not in prev_sys_path:
new_sys_path.append(item)
sys.path.remove(item)
sys.path[:0] = new_sys_path
activate_this = '/home/jeremydagorn/.virtualenvs/env7/bin/activate_this.py'
execfile(activate_this, dict(__file__=activate_this))
sys.path.append(os.path.dirname(__file__))
from base import app as application
application.debug = True
Now, just go to the address where your application is supposed to run and check that everything works.
Maintenant, chargez simplement l'url de votre application et vérifier que tout fonctionne.
En cas de problèmes, votre meilleur ami est le fichier error.log:
jeremydagorn@ssh:~$ cd ~/admin/log/
jeremydagorn@ssh:~/admin/log$ ls
2011 2012 2013 2014 access.log error.log
Basic http auth est très simple à utiliser. Néanmoins, une option Apache est nécessaire pour valider son fonctionnement. Cette option permet à votre application de recevoir les headers nécessaires à l'authentification de votre utilisateurs.
Créez simplement un .htaccess à la racine de votre projet et ajoutez la ligne suivante:
WSGIPassAuthorization On
Visitez cette page et copier coller la classe LoggingMiddleware dans votre fichier wsgi. Vous serez donc capable de voir toutes les requêtes et réponses recues par votre application.
3. pip ne parvient pas à installer une de mes dépendances, se plaignant de ne rien trouver concernant celle-ci au supposé téléchargement
Si votre commande retourne quelque chose de similaire:
Could not find any downloads that satisfy the requirement <requirement> in /usr/local/lib/python2.7/dist-packages
Some externally hosted files were ignored (use --allow-external spyder to allow).
No distributions at all found for ...
Vérifiez votre version de pip. Si elle est égale à la version 1.5 ou plus, tentez les choses suivantes:
--process-dependency-links
à ajouter avec le pip install où ce qui a fonctionné pour moi:
pip install -U --allow-external twill --allow-unverified twill twill
Alwaysdata a de la documentation documentation expliquant comment installer des modules python. Dans mon cas je souhaitais utiliser lxml, que j'installa en utilisant easy_install. Si vous suivez la documentation à la lettre, la seule chose à faire après installation est de rajouter la ligne suivant dans votre fichier wsgi:
ALLDIRS = ['/home/jeremydagorn/.virtualenvs/env7/lib/python2.7/site-packages', "<folder_where_your_package_is_installed"]
J'espère que cela vous aider. Si vous avez des questions, n'hésitez pas à me contacter sur twitter ou github.
An extra english line remains :
Now, just go to the address where your application is supposed to run and check that everything works.