créer un compte

aller sur le lien https://www.pythonanywhere.com/
et créer un compte

pythonAnyWhere : le tableau de bord : “dashboard”

il faudra chercher dans vos “emails” et confirmer la création de votre compte

créer la base de données

aller sur le lien “database”

pythonAnyWhere : init BDD

“initialize mysql” : mettre un autre mot de passe que celui du compte car le mot de passe est en clair dans le code de l’application

pythonAnyWhere : init BDD

une fois le compte créé, recopier dans un fichier (voir exemple ci-dessus) : le nom du “host”, le nom du “Username”, le nom de la base de données “database” et le mot de passe “password”


cliquer sur la base de données (amillet2$default dans l’exemple)


Un terminal connecté à mysql s’ouvre

pythonAnyWhere : init BDD

recopier le SQL pour supprimer/créer les tables puis insérer les enregistrements de votre jeu de test


revenir sur le tableau de bord (dashboard) , en cliquant dans le terminal sur le lien en haut à gauche

télécharger son application

télécharger l’application ; dans le DashBoard sélectionner Browse Files


faire une archive “.zip” de votre application


télécharger ce fichier sur le serveur pythonAnyWhere

pythonAnyWhere : télécharger un fichier zip avec votre application


Ouvrir une console (terminal) sur le serveur pythonAnyWhere

Dans la console, extraire l’application (votre fichier “.zip”), exemple :

unzip S1_pymysql_flask_pythonanywhere.zip
pythonAnyWhere : désarchiver votre fichier zip avec votre application

puis revenir au “dashboard”, toujours avec le lien en haut à gauche

lancer l’application

Remarque : vos 2 terminaux sont accessibles depuis le “dashboard” : un connecté à votre base de données mysql, l’autre terminal “bash” à la racine de l’application

pythonAnyWhere : préparer et lancer l’application

dans le DashBoard sélectionner (cliquer) open web app

puis

pythonAnyWhere : préparer et lancer l’application


Vérification du fichier de configuration

Depuis le “DashBoard”, sélectionner le lien “web” dans le menu


Dans : le Configuration for <login.pythonanywhere.com>

Rechercher :

WSGI configuration file:/var/www/login_pythonanywhere_com_wsgi.py

pythonAnyWhere : fichier de configuration du point d’entrée

éditer le fichier en cliquant dessus

un code qui ressemble à celui ci-dessous doit être dans ce fichier (on y trouve : où se trouve le fichier “app.py” , si le fichier pour lancer l’application ne s’appelle pas app.py et que l’instance de l’objet Flask ne s’appelle pas app, il faut modifier la dernière ligne)

import sys
path = '/home/amillet'
if path not in sys.path:
   sys.path.insert(0, path)

from app import app as application


Dans la dernière version testée, il faut remplacer le code dans le fichier par celui ci-dessus.

derniere test fait sur pythonanywhere


pythonAnyWhere : fichier de configuration du point d’entrée (ancienne version)

ATTENTION le fichier app.py peut être (est) écrasé.
Éditer le fichier app.py et recopier le contenu (si besoin)



utilisation de la base de données

Votre application doit absolument ouvrir et fermer la connexion à chaque requête HTTP pour éviter les fuites de mémoires.

L’hébergeur pythonAnyWhere stoppe les connexions après un petit moment.

Exemple de code dans votre application (voir les TPs)

@app.teardown_appcontext
def close_connection(exception):
    db = getattr(g, '_database', None)
    if db is not None:
        db.close()
def get_db():
    db = getattr(g, '_database', None)
    if db is None:
        #db = g._database = sqlite3.connect(DATABASE)
        db = g._database = pymysql.connect(
            #host="localhost",     # ou serveurmysql à l'iut
            #user="votreLogin",
            #password="votreMotDePasse",
            #database="BDD_votreLogin",
            user="amillet2",
            host="amillet2.mysql.pythonanywhere-services.com",
            passwd="####mdp####",
            database="amillet2$default",

            charset='utf8mb4',
            cursorclass=pymysql.cursors.DictCursor
        )
    return db

“open web app”

pythonAnyWhere : relancer l’application


Si vous voulez utiliser dotenv (voir en annexe à la fin du document)


Si vous avez une erreur :

gestion des erreurs

Depuis le “dashboard”, cliquer sur le lien “open web app” ou “web” dans le menu


pythonAnyWhere : fichierd de log
2021-12-05 10:14:12,020: Error running WSGI application
2021-12-05 10:14:12,021: ModuleNotFoundError: No module named 'pymysql'
2021-12-05 10:14:12,021:   File "/var/www/amillet2_pythonanywhere_com_wsgi.py", line 16, in <module>
2021-12-05 10:14:12,021:     from app import app as application  # noqa
2021-12-05 10:14:12,022: 
2021-12-05 10:14:12,022:   File "/home/amillet2/app.py", line 5, in <module>
2021-12-05 10:14:12,022:     import pymysql.cursors
2021-12-05 10:14:12,022: ***************************************************
2021-12-05 10:14:12,022: If you're seeing an import error and don't know why,
2021-12-05 10:14:12,022: we have a dedicated help page to help you debug: 
2021-12-05 10:14:12,022: https://help.pythonanywhere.com/pages/DebuggingImportError/
2021-12-05 10:14:12,022: ***************************************************

dans ce cas d’erreur, il faut installer pymysql

pip install pymysql

et recharger l’application

ANNEXES : les erreurs classiques



echo '' > /var/log/amillet3.pythonanywhere.com.error.log
echo '' > /var/log/amillet3.pythonanywhere.com.server.log
rm -rf ~/.cache
2022-01-29 15:55:55,477: Error running WSGI application
2022-01-29 15:55:55,477: ModuleNotFoundError: No module named 'pymysql'
2022-01-29 15:55:55,478:   File "/var/www/amillet3_pythonanywhere_com_wsgi.py", line 16, in <module>
2022-01-29 15:55:55,478:     from file_app import app as application  # noqa
2022-01-29 15:55:55,478: 
2022-01-29 15:55:55,478:   File "/home/amillet3/projet_biblio/file_app.py", line 8, in <module>
2022-01-29 15:55:55,478:     from controllers.auth_security import *
2022-01-29 15:55:55,479: 
2022-01-29 15:55:55,479:   File "/home/amillet3/projet_biblio/controllers/auth_security.py", line 8, in <module>
2022-01-29 15:55:55,479:     from connexion_db import get_db
2022-01-29 15:55:55,481: 
2022-01-29 15:55:55,481:   File "/home/amillet3/projet_biblio/connexion_db.py", line 3, in <module>
2022-01-29 15:55:55,481:     import pymysql.cursors
2022-01-29 15:55:55,481: ***************************************************
2022-01-29 15:55:55,482: If you're seeing an import error and don't know why,
2022-01-29 15:55:55,482: we have a dedicated help page to help you debug: 
2022-01-29 15:55:55,482: https://help.pythonanywhere.com/pages/DebuggingImportError/
2022-01-29 15:55:55,482: ***************************************************

bien configurer le fichier /var/www/login_pythonanywhere_com_wsgi.py


exemple :


~ $ tree -d                                                                                                                                                                             
.
└── projet_biblio
    ├── bdd
    ├── controllers
    ├── static
    │   └── assets
    │       ├── css
    │       ├── images
    │       ├── img
    │       └── js
    │           ├── foundation
    │           └── vendor
    └── templates
    │   ├── admin
    │   │   ├── adherent
    │   │   ├── auteur
    │   │   ├── dataviz
    │   │   ├── emprunt
    │   │   ├── exemplaire
    │   │   ├── oeuvre
    │   │   └── type_article
    │   ├── auth
    │   └── client
    │       ├── boutique
    │       └── commandes
    └──file_app.py
    └──connexion_db.py 

# This file contains the WSGI configuration required to serve up your
# web application at http://<your-username>.pythonanywhere.com/
# It works by setting the variable 'application' to a WSGI handler of some
# description.
#
# The below has been auto-generated for your Flask project

import sys

# add your project directory to the sys.path
project_home = '/home/amillet3/projet_biblio'
if project_home not in sys.path:
    sys.path = [project_home] + sys.path

# import flask app but need to call it "application" for WSGI to work
from file_app import app as application  # noqa

ANNEXE : Utilisation de dotenv

Documentation de dotenv

Commencer par installer le paquet :

pip install python-dotenv

Modifier un peu le début du fichier app.py

#! /usr/bin/python
# -*- coding:utf-8 -*-
from flask import Flask, request, render_template, redirect, flash

app = Flask(__name__)
app.secret_key = 'une cle(token) : grain de sel(any random string)'

from flask import session, g
import pymysql.cursors

import os                                 # à ajouter
from dotenv import load_dotenv            # à ajouter
load_dotenv()                             # à ajouter

def get_db():
    if 'db' not in g:
        g.db =  pymysql.connect(
            host=os.environ.get("HOST"),                # à modifier
            user=os.environ.get("LOGIN"),               # à modifier
            password=os.environ.get("PASSWORD"),        # à modifier
            database=os.environ.get("DATABASE"),        # à modifier
            charset='utf8mb4',
            cursorclass=pymysql.cursors.DictCursor
        )
    return g.db

@app.teardown_appcontext
def teardown_db(exception):
    db = g.pop('db', None)
    if db is not None:
        db.close()

Créez un fichier .env à la racine du projet (au même niveau que app.py)

HOST="localhost",  
PASSWORD="secret"
LOGIN="login"
DATABASE="BDD_login"


Sur pythonanywhere, remplacer :

load_dotenv()

par 2 lignes comme celles ci-dessous (voir stackoverflow) :

project_folder = os.path.expanduser('~/sae_s2_2024')  # adjust as appropriate (avec le dossier où se trouve le fichier .env et app.py)
load_dotenv(os.path.join(project_folder, '.env'))