IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Réseau/Web Python Discussion :

[Flask]je crois que je suis perdu [Python 3.X]


Sujet :

Réseau/Web Python

  1. #1
    Membre à l'essai
    Homme Profil pro
    Analyste d'exploitation
    Inscrit en
    Mars 2020
    Messages
    14
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 58
    Localisation : France, Loiret (Centre)

    Informations professionnelles :
    Activité : Analyste d'exploitation

    Informations forums :
    Inscription : Mars 2020
    Messages : 14
    Points : 16
    Points
    16
    Par défaut [Flask]je crois que je suis perdu
    Bonjour à tout le monde


    je développe depuis plusieurs années par intermittence une petite application immobiliers ( suivi quittance, édition automatique, etc....)

    dans l'IDE, çà se passait bien..j'ai décidé de continuer a développer sur mon poste, et a installer l'appli en production ( serveur dédié, passage de flask à gunicorn)

    Le problème est que ça ne démarre pas, pas de message d'erreur, rien a l écran, ni dans les logs

    voici l'archi

    REP_INSTALL
    |____________.flaskenv
    |____________config
    |____________immo.py
    |____________immo
    |_____routes.py
    |_____routes_listes.py
    |_____routes_ajout.py
    |_____....
    |_____models.py
    |_____templates
    |________index.html

    Nom : ksnip_20230323-172351.png
Affichages : 120
Taille : 10,8 Ko

    et voici les fichiers

    .flaskenv :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    FLASK_APP=immo.py
    #FLASK_DEBUG=on
    # SQL Database
    # Leave comment for SQLite3 database
    # Uncomment and update for mysql database
    # SQLALCHEMY_DATABASE_URI=mysql+pymysql://MYSQL_USER:MYSQL_PASSWORD@MYSQL_SERVER:3306/DATABASE
    # Uncomment and update for mysql database
    SQLALCHEMY_DATABASE_URI=mysql+pymysql://immo:PASSWORD@localhost:3306/IMMOBILIER
    # Directory to Install
    REP_INSTALL=/Projet/ma-PGI
    config.py :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    import os
    basedir = os.path.abspath(os.path.dirname(__file__))
     
     
    class Config(object):
        SECRET_KEY = os.environ.get('SECRET_KEY') or 'you-will-never-guess'
        SQLALCHEMY_DATABASE_URI = os.environ.get('SQLALCHEMY_DATABASE_URI') or \
            'sqlite:///' + os.path.join(basedir, 'immo.db')
        SQLALCHEMY_TRACK_MODIFICATIONS = False
     
     
    class App_Config(object):
        REP_CONTRAT_LOCATION = os.path.join(basedir, "Fichiers/Contrats_de_locations/")
        REP_QUITTANCES       = os.path.join(basedir, "Fichiers/Quittances/")
        REP_MODELES          = os.path.join(basedir, "Fichiers/Modeles/")
        REP_LOG              = os.path.join(basedir, "Logs/")
        FICHIER_LOG          = os.path.join(basedir, REP_LOG + "immo.log")
        NIVEAU_LOG           = "INFO" # ou WARN ou DEBUG ou ERROR
        Message_IHM          = ""
    immo.py :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    import config
    from immo import immo as application, db
    from immo.models import Appartements, Locations
     
     
    @immo.shell_context_processor
    def make_shell_context():
        return {'db': db, 'Appartements': Appartements, 'Locataire': Locations}
     
     
    app = application
    immo/__init__.py
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
     
    from flask import Flask
    from flask_sqlalchemy import SQLAlchemy
    from flask_migrate import Migrate
    from config import Config, App_Config
     
     
    immo = Flask(__name__)
    immo.config.from_object(Config)
    immo.config.from_object(App_Config)
    db = SQLAlchemy(immo)
    migrate = Migrate(immo, db)
     
     
    from immo import routes, routes_ajouts, routes_init, routes_listes, routes_divers, routes_modifications, models


    immo/routes.py
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
     
     
    from flask import render_template
    from immo import immo
    from config import App_Config
    from immo.models import Appartements,Encaissements
    from flask_sqlalchemy import SQLAlchemy
    import logging
     
    import locale
     
    locale.setlocale(locale.LC_TIME, '')
     
     
     
    logging.basicConfig(filename=App_Config.FICHIER_LOG, level=logging.INFO, format='%(asctime)s -- %(name)s -- %(levelname)s -- %(message)s')
    logging.getLogger('sqlalchemy.engine').setLevel(logging.INFO)
     
    #db = SQLAlchemy(immo)
     
    @immo.route('/')
    @immo.route('/index')
    def index():
        Titre_Page = "ma PGI :: Accueil"
        db = SQLAlchemy(immo)
        print("toto")
        nb_a = db.session.query(Appartements).count()
        nb_a_libre=db.session.query(Appartements).filter(Appartements.LIBRE==0).count()
     
        print(nb_a,nb_a_libre)
        nb_e = db.session.query(Encaissements).count()
        nb_loyers = db.session.query(Encaissements).filter(Encaissements.TYPE_ENCAISSEMENT=='Loyer et Charges').count()
        print(nb_e, nb_loyers)
        return render_template('index.html', TITRE_PAGE=Titre_Page,NB_APPARTEMENTS=nb_a,NB_APPARTEMENTS_LIBRES=nb_a_libre, NB_ENCAISSEMENTS=nb_e, NB_LOYERS=nb_loyers, Affichage_Message_Information="True", Message_IHM=App_Config.Message_IHM)
    immo/models.py
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
     
    from immo import db
    from dataclasses import dataclass
     
     
    class Appartements(db.Model):
        __tablename__ = "T_APPARTEMENTS"
        id = db.Column(db.Integer, primary_key=True)
        NUMERO = db.Column(db.Integer, )
        NOM_VOIE = db.Column(db.String(10), )
        VOIE = db.Column(db.String(50))
        CP = db.Column(db.Integer)
        VILLE = db.Column(db.String(50))
        RESIDENCE = db.Column(db.String(30))
        NOM_PROPRIETAIRE = db.Column(db.String(50))
        DATE_ACHAT = db.Column(db.Date)
        LIBRE = db.Column(db.Integer)
     
        def __repr__(self):
            return str(self.id)
     
        def save(self):
            db.session.add(self)
            db.session.commit()
     
        def update_data(self, new_data):
            self.data = new_data
     
        @classmethod
        def get_by_id(cls, id):
            return cls.query.filter_by(id=id).first()
     
        def toDICT(self):
     
            cls_dict = {}
            cls_dict['_id'] = self.id
            cls_dict['data'] = self.data
     
            return cls_dict
     
        def toJSON(self):
     
            return self.toDICT()
     
     
    class Locations(db.Model):
        __tablename__ = "T_LOCATIONS"
    Erreur dans le navigateur
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Internal Server Error
     
    The server encountered an internal error and was unable to complete your request. Either the server is overloaded or there is an error in the application.

    Ce code va peut-être vous choquer...mais j'apprends doucement, sur mon temps libre, alors soyez indulgents ;-)
    Il y a 6 mois, il y avait plein de requêtes sql, j'ai décidé de passer avec SQL Alchemy, pour apprendre....bref, j'ai fait des choses pour améliorer et sécuriser , je me suis documenté, du mieux que mon anglais défaillant me le permet

    Merci d'avance à ceux qui voudront/pourront m'aider

    Olivier

  2. #2
    Membre chevronné
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    721
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Mai 2006
    Messages : 721
    Points : 1 876
    Points
    1 876
    Par défaut
    Si ça vous fonctionne sur votre poste de dév, le problème vient probablement de la configuration qui est différente sur le serveur, comme les paths, voire de modules manquants.

    Commencez par regarder dans les logs du serveur web, je ne sais pas si vous utilisez Apache, Nginx ou autre. Vous devriez facilement pouvoir trouver les logs notamment error.log ou quelque chose de ce genre. Vous aurez probablement un indice. gunicorn doit avoir ses logs aussi.

    Je vois que vous utilisez le module logging, ce qui est une bonne chose, mais dans votre code on ne voit pas s'il est effectivement utilisé. Par contre on voit des prints, alors que vous pourriez écrire logging.debug à la place. Mettez des traces au début de votre application et vous verrez si ça se lance au moins jusqu'à un certain point. Pensez aussi à ajouter une gestion d'exception dans le point d'entrée de votre application. En cas d'erreur, crachez le détail de l'exception dans le log, ça vous aidera beaucoup pour débugger.

    Il ne faut vraiment pas grand-chose. Voici un exemple de code minimaliste avec en prime une erreur artificielle à titre de démonstration.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    def main():
        try:
            logger.info("Application starting")
     
            raise ValueError("let's crash")
     
            # ...
        except Exception as ex:
            logging.exception("Unhandled exception")
            sys.exit(1)
        finally:
            logger.info("Application terminating")
    Comme ça vous avez une gestion d'exception de dernier recours si votre code crashe quelque part et que vous ne gérez pas les erreurs explicitement par le biais d'un block try/catch.

  3. #3
    Expert confirmé Avatar de papajoker
    Homme Profil pro
    Développeur Web
    Inscrit en
    Septembre 2013
    Messages
    2 105
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nièvre (Bourgogne)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Septembre 2013
    Messages : 2 105
    Points : 4 455
    Points
    4 455
    Par défaut
    bonjour

    Difficile(même impossible) de répondre car tu ne donnes pas d'infos sur ton installation, et je ne suis même pas sûr que tu utilises gunicorn (pas vu de wsgi) sur ton serveur.
    Tu peux lancer flash en debug mode.

    Si ton code est valide en local, cela ne doit pas être une question de code mais de configuration. A voir quand même la version python sur le serveur, généralement elle est relativement ancienne par rapport à nos postes, on utilise donc la même en local.
    Normalement on teste notre config avant production en local avec docker qui va justement permettre de tester dans le même environnement que le serveur, et accessoirement préparer des outils de déploiement.
    $moi= ( !== ) ? : ;

  4. #4
    Expert éminent
    Avatar de fred1599
    Homme Profil pro
    Lead Dev Python
    Inscrit en
    Juillet 2006
    Messages
    3 824
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : Lead Dev Python
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Juillet 2006
    Messages : 3 824
    Points : 7 120
    Points
    7 120
    Par défaut
    Bonjour,

    Peut-être commencer par tester la commande gunicorn, voir la doc Flask !
    Celui qui trouve sans chercher est celui qui a longtemps cherché sans trouver.(Bachelard)
    La connaissance s'acquiert par l'expérience, tout le reste n'est que de l'information.(Einstein)

  5. #5
    Membre à l'essai
    Homme Profil pro
    Analyste d'exploitation
    Inscrit en
    Mars 2020
    Messages
    14
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 58
    Localisation : France, Loiret (Centre)

    Informations professionnelles :
    Activité : Analyste d'exploitation

    Informations forums :
    Inscription : Mars 2020
    Messages : 14
    Points : 16
    Points
    16
    Par défaut
    Bonsoir

    merci d'avoir pris le temps de me lire et pour certain de me répondre

    Le soir où j'ai posté cette demande d'aide, je me suis dit "Et si tu repartais de zero?"

    C'est ce que j'ai fait. Je suis parti de ça ==> https://hackersandslackers.com/flask-routes/ et j'ai inséré mes routes, et mes fonctions au fur et à mesure.

    Tout fonctionne, donc, sauf gunicorn...mais j'ai utililsé waitress à la place et ça me va bien

    Bonne fin de journée

  6. #6
    Membre à l'essai
    Homme Profil pro
    Analyste d'exploitation
    Inscrit en
    Mars 2020
    Messages
    14
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 58
    Localisation : France, Loiret (Centre)

    Informations professionnelles :
    Activité : Analyste d'exploitation

    Informations forums :
    Inscription : Mars 2020
    Messages : 14
    Points : 16
    Points
    16
    Par défaut
    Citation Envoyé par binarygirl Voir le message
    Si ça vous fonctionne sur votre poste de dév, le problème vient probablement de la configuration qui est différente sur le serveur, comme les paths, voire de modules manquants.

    Commencez par regarder dans les logs du serveur web, je ne sais pas si vous utilisez Apache, Nginx ou autre. Vous devriez facilement pouvoir trouver les logs notamment error.log ou quelque chose de ce genre. Vous aurez probablement un indice. gunicorn doit avoir ses logs aussi.

    Je vois que vous utilisez le module logging, ce qui est une bonne chose, mais dans votre code on ne voit pas s'il est effectivement utilisé. Par contre on voit des prints, alors que vous pourriez écrire logging.debug à la place. Mettez des traces au début de votre application et vous verrez si ça se lance au moins jusqu'à un certain point. Pensez aussi à ajouter une gestion d'exception dans le point d'entrée de votre application. En cas d'erreur, crachez le détail de l'exception dans le log, ça vous aidera beaucoup pour débugger.

    Il ne faut vraiment pas grand-chose. Voici un exemple de code minimaliste avec en prime une erreur artificielle à titre de démonstration.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    def main():
        try:
            logger.info("Application starting")
     
            raise ValueError("let's crash")
     
            # ...
        except Exception as ex:
            logging.exception("Unhandled exception")
            sys.exit(1)
        finally:
            logger.info("Application terminating")
    Comme ça vous avez une gestion d'exception de dernier recours si votre code crashe quelque part et que vous ne gérez pas les erreurs explicitement par le biais d'un block try/catch.
    C'est une tres bonne idée, ce bout de code pour logguer les erreurs, je vais essayer

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [2016] LAST_VALUE() ne fait pas ce que je veux, je suis perdu
    Par StringBuilder dans le forum Développement
    Réponses: 13
    Dernier message: 02/06/2021, 09h33
  2. RAM DDR, PC3200, 333Mhz , 400Mhz je suis perdu
    Par ahage4x4 dans le forum Composants
    Réponses: 2
    Dernier message: 08/12/2005, 17h52
  3. Réponses: 4
    Dernier message: 13/08/2005, 10h20
  4. DLL et MainForm je suis perdu !
    Par rudy2 dans le forum C++Builder
    Réponses: 28
    Dernier message: 02/01/2005, 18h08

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo