Instantly share code, notes, and snippets.

Embed
What would you like to do?
Déploiement d'une application flask sur alwaysdata (english version on http://flask-blog.jeremydagorn.com)

Contexte

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

Installation de python


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

Installation de setuptools et pip


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)

Installation de virtualenv


Maintenant que pip est installé, installer virtualenv et virtualenvwrapperest 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.

Installation de flask et des différentes librairies


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

Création de votre fichier wsgi


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

Problèmes rencontrés


1. Comment utiliser le module basic http authentication en production

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
2. Comment débugger si quelque chose ne fonctionne pas?

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
4. Comment utiliser des modules python non-installés dans mon virtualenv

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"]

Conclusion

J'espère que cela vous aider. Si vous avez des questions, n'hésitez pas à me contacter sur twitter ou github.

Quelques références.

@valkheim

This comment has been minimized.

valkheim commented Dec 31, 2017

An extra english line remains : Now, just go to the address where your application is supposed to run and check that everything works.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment