aller sur le lien https://www.pythonanywhere.com/
et créer un
compte
il faudra chercher dans vos “emails” et confirmer la création de votre compte
aller sur le lien “database”
“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
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
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 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
Ouvrir une console (terminal) sur le serveur pythonAnyWhere
Dans la console, extraire l’application (votre fichier “.zip”), exemple :
unzip S1_pymysql_flask_pythonanywhere.zip
puis revenir au “dashboard”, toujours avec le lien en haut à gauche
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
dans le DashBoard sélectionner (cliquer) open web app
puis
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
é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.
ATTENTION le fichier app.py peut être (est) écrasé.
Éditer le fichier app.py et recopier le contenu (si besoin)
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”
Si vous voulez utiliser dotenv (voir en annexe à la fin du document)
Si vous avez une erreur :
Depuis le “dashboard”, cliquer sur le lien “open web app” ou “web” dans le menu
cliquer sur le fichier “pythonanaywhere.com.error.log” pour voir le fichier de log avec les erreurs (équivalent aux erreurs dans une console)
exemple de message d’erreurs
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
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
= '/home/amillet3/projet_biblio'
project_home if project_home not in sys.path:
= [project_home] + sys.path
sys.path
# import flask app but need to call it "application" for WSGI to work
from file_app import app as application # noqa
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
= Flask(__name__)
app = 'une cle(token) : grain de sel(any random string)'
app.secret_key
from flask import session, g
import pymysql.cursors
import os # à ajouter
from dotenv import load_dotenv # à ajouter
# à ajouter
load_dotenv()
def get_db():
if 'db' not in g:
= pymysql.connect(
g.db =os.environ.get("HOST"), # à modifier
host=os.environ.get("LOGIN"), # à modifier
user=os.environ.get("PASSWORD"), # à modifier
password=os.environ.get("DATABASE"), # à modifier
database='utf8mb4',
charset=pymysql.cursors.DictCursor
cursorclass
)return g.db
@app.teardown_appcontext
def teardown_db(exception):
= g.pop('db', None)
db 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) :
= os.path.expanduser('~/sae_s2_2024') # adjust as appropriate (avec le dossier où se trouve le fichier .env et app.py)
project_folder '.env')) load_dotenv(os.path.join(project_folder,