OVH permettait l'exécution du code Python sur son hébergement mutualisé. La version de Python utilisée était 2.6 mais Flask et ses dependances n'étaient sont pas installés en standard (vérifier).
Flask-0.10.1 (télécharger) fonctionne sur cet environnement. Ses dépendances sont :
- itsdangerous-0.24 (télécharger)
- Jinja2-2.8 (télécharger)
- MarkupSafe-0.23 (télécharger)
- Werkzeug-0.11.3 (télécharger)
- wheel-0.26.0 (télécharger)
Une fois les archives téléchargées extrayez-les dans un dossier projets
.
Placez le code de votre application Flask dans le dossier projets/website
.
L'arborescence résultante est la suivante :
/
├ projects/
│ ├ Flask-0.10.1/
│ │ ├ flask/
│ │ └ LICENSE
│ ├ itsdangerous-0.24/
│ │ ├ itsdangerous.py
│ │ └ LICENSE
│ ├ Jinja2-2.8/
│ │ ├ jinja2/
│ │ └ LICENSE
│ ├ MarkupSafe-0.23/
│ │ ├ markupsafe/
│ │ └ LICENSE
│ ├ Werkzeug-0.11.3/
│ │ ├ werkzeug/
│ │ └ LICENSE
│ ├ wheel-0.26.0/
│ │ ├ wheel/
│ │ └ LICENSE
│ └ website/
│ ├ templates/
│ | ├ template1.htm
│ | └ template2.htm
│ ├ main.py
│ ├ __init__.py
│ └ database.sqlite
└ www/
├ static/
│ ├ css/
│ ├ img/
│ └ js/
├ flask.cgi
├ .htaccess
├ sitemap.gz
└ robots.txt
Cette arborescence peut être personnalisée grâce aux instructions sys.path.append
du fichier flask.cgi
.
Ces instructions sont également à adapter en fonction du nom de votre compte OVH (moncompte
dans le fichier ci-joint). En cas de doute, vous pouvez obtenir cette information en créant dans le dossier www
un fichier PHP contenant <?php echo getcwd(); ?>
.
Le fonctionnement repose sur les fichiers /www/.htaccess
et /www/flask.cgi
donnés ci-joints.
Il est essentiel que les permissions du fichier /www/flask.cgi
soient 755
ou supérieures. Le problème est que le serveur OVH remet les permissions à 604
dès que le fichier est modifié. Pensez-y quand vous rencontrez des erreurs 500 !
Astuce : si vous hébergez votre site sur un contrat start10m
(donc avec 10 Mo d'espace disque), vous pouvez supprimer tous les fichiers et dossiers des projets (docs
, examples
, artwork
, etc.) sauf flask
, itsdangerous.py
, jinja2
, markupsafe
, werkzeug
et wheel
(et, pour respecter les license, LICENSE
). Le dossier projets
est ainsi réduit à 2,2 Mo !
De plus, par défaut, Python va stocker les fichiers bytecode
(*.pyc
) et ceux-ci réduiront d'autant l'espace disponible pour l'hébergement. Les lignes suivantes, à ajouter au fichier django.cgi
, permettent d'empêcher Python de stocker ces fichiers (au prix d'une réduction des performances) :
os.environ['PYTHONDONTWRITEBYTECODE'] = '1'
sys.dont_write_bytecode = True
Bonjour,
J'essaye de porter une application Flask sur un serveur WEB OVH, mais je rencontre toujours une erreur 500 en consultant la page www du sous domaine utilisé.
J'ai essayé de suivre le readme.
J'ai dons la meme arborescence et voici le contenu des ficheirs :
Flask.cgi :
#!/usr/bin/python
encoding: utf-8
import os, sys
sys.path.append("/home/lyceedesx/www/ldmarket/www/projects/") # À modifier
sys.path.append("/home/lyceedesx/www/ldmarket/www/projects/website/") # À modifier
sys.path.append("/home/lyceedesx/www/ldmarket/www/projects/Flask-0.10.1") # À modifier
sys.path.append("/home/lyceedesx/www/ldmarket/www/projects/itsdangerous-0.24") # À modifier
sys.path.append("/home/lyceedesx/www/ldmarket/www/projects/Jinja2-2.8") # À modifier
sys.path.append("/home/lyceedesx/www/ldmarket/www/projects/MarkupSafe-0.23") # À modifier
sys.path.append("/home/lyceedesx/www/ldmarket/www/projects/website") # À modifier
sys.path.append("/home/lyceedesx/www/ldmarket/www/projects/Werkzeug-0.11.3") # À modifier
sys.path.append("/home/lyceedesx/www/ldmarket/www/projects/wheel-0.26.0") # À modifier
def run_with_cgi(application):
environ = dict(os.environ.items())
environ['wsgi.input'] = sys.stdin
environ['wsgi.errors'] = sys.stderr
environ['wsgi.version'] = (1,0)
environ['wsgi.multithread'] = False
environ['wsgi.multiprocess'] = True
environ['wsgi.run_once'] = True
try:
os.environ['PYTHONDONTWRITEBYTECODE'] = '1'
sys.dont_write_bytecode = True
from website.main import app as application
run_with_cgi(application)
except Exception, inst:
print "Content-type: text/html\n\n"
print inst
Et mon main.py :
from flask import Flask, render_template
app = Flask(name)
@app.route('/')
def index():
return render_template('template1.htm')
@app.route('/page2')
def page2():
return render_template('template2.htm')
if name == 'main':
app.run(debug=False)