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

PyQt Python Discussion :

Connexion à une base de données en ligne [QtSql]


Sujet :

PyQt Python

  1. #1
    Membre averti
    Femme Profil pro
    Ingénieur informatique scientifique
    Inscrit en
    Mai 2010
    Messages
    313
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 34
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur informatique scientifique
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Mai 2010
    Messages : 313
    Points : 301
    Points
    301
    Par défaut Connexion à une base de données en ligne
    Bonjour,

    je souhaiterais pouvoir me connecter à la base de données de mon site internet depuis mon application Python Qt.
    Déjà: est-ce possible? Peut-être que les connexions externes sont interdites par mon hébergeur (1&1)?

    Voici mon code:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    db = QtSql.QSqlDatabase.addDatabase("QMYSQL")
    db.setHostName("adresseDeMaBddEnLigne");
    db.setUserName("monUserName");
    db.setPassword("monPassword");
    db.setDatabaseName("maBdd")
    db.open()
    J'ai bien vérifié que les identifiants, nom de la base etc. sont corrects, ce sont les mêmes que j'utilise pour me connecter dans le code php de mon site.

    Cependant db.open() renvoie toujours False.
    Quelqu'un peut-il m'aider?

    Merci d'avance

  2. #2
    Expert éminent
    Avatar de tyrtamos
    Homme Profil pro
    Retraité
    Inscrit en
    Décembre 2007
    Messages
    4 462
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2007
    Messages : 4 462
    Points : 9 249
    Points
    9 249
    Billets dans le blog
    6
    Par défaut
    Bonjour,

    Par curiosité j'ai essayé aussi d'accéder à une de mes bases de données chez mon hébergeur avec PyQt4, et: ça ne marche pas non plus. A noter qu'en cas d'erreur à l'ouverture, db.lastError().text() donne un message d'erreur plus explicite que "False".

    J'ai épluché la doc de mon hébergeur, et j'ai trouvé: l'accès extérieur à MySql est bloqué (le port est fermé). Seuls les accès venant du serveur sont permis (par php par exemple). A vérifier si c'est aussi le cas pour 1&1.

    Une solution possible: faire un relai par un script en php ou en python_cgi qui, en s'exécutant côté serveur, répercutera les requêtes venant de l'extérieur vers MySql.
    Un expert est une personne qui a fait toutes les erreurs qui peuvent être faites, dans un domaine étroit... (Niels Bohr)
    Mes recettes python: http://www.jpvweb.com

  3. #3
    Membre averti
    Femme Profil pro
    Ingénieur informatique scientifique
    Inscrit en
    Mai 2010
    Messages
    313
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 34
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur informatique scientifique
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Mai 2010
    Messages : 313
    Points : 301
    Points
    301
    Par défaut
    Merci pour ta réponse,
    j'ai regardé pour 1&1, effectivement ils bloquent eux aussi l'accès externe aux bases de données.
    J'ai du mal à voir comment faire concrètement ce relais dont tu parles avec un script php? Comment lier ce script à mon programme PyQt?

  4. #4
    Expert éminent
    Avatar de tyrtamos
    Homme Profil pro
    Retraité
    Inscrit en
    Décembre 2007
    Messages
    4 462
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2007
    Messages : 4 462
    Points : 9 249
    Points
    9 249
    Billets dans le blog
    6
    Par défaut
    Le principe est simple, l'écriture du script le sera moins.

    Imaginons ce script comme une page web écrite en html+php sur le serveur.

    - on l'appelle comme n'importe quelle page web, en lui transmettant des données comme avec un formulaire (=la requête sql).

    - la partie php s'exécute côté serveur: transmet la requête à MySql et reçoit la réponse

    - à la fin d'exécution, la partie php fabrique une réponse en html et la renvoie à l'appelant, qui la reçoit comme le fait un navigateur: il "suffit" d'extraire les données avec un parser html.

    J'ai déjà fait quelque chose d'approchant en python_cgi (exécution côté serveur) pour une calculatrice en ligne (http://calculext.jpvweb.com/), à part que le script communique avec l'interpréteur Python pour faire les calculs et non avec un serveur de base de données. Ça devrait être la même chose en php avec mysql.
    Un expert est une personne qui a fait toutes les erreurs qui peuvent être faites, dans un domaine étroit... (Niels Bohr)
    Mes recettes python: http://www.jpvweb.com

  5. #5
    Membre averti
    Femme Profil pro
    Ingénieur informatique scientifique
    Inscrit en
    Mai 2010
    Messages
    313
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 34
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur informatique scientifique
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Mai 2010
    Messages : 313
    Points : 301
    Points
    301
    Par défaut
    D'accord,
    mais du coup comment "appeler" mon script, situé sur le serveur 1&1, depuis mon programme python?
    Et comment mon script peut lui communiquer les résultats de la requête SQL?

  6. #6
    Expert éminent
    Avatar de tyrtamos
    Homme Profil pro
    Retraité
    Inscrit en
    Décembre 2007
    Messages
    4 462
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2007
    Messages : 4 462
    Points : 9 249
    Points
    9 249
    Billets dans le blog
    6
    Par défaut
    Au lieu d'utiliser un navigateur comme je l'ai fait avec ma calcultrice, on peut utiliser le module Python urllib2 (urllib sous Python 3.x) pour demander une page web en transmettant une requête, et recevoir le texte html en retour.

    A titre d'exemple, j'ai vu quelque part comment on interroge google à partir de Python 2.7 (ici avec le mot "tyrtamos", qui donnera mon site web en 1er):

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    import urllib2
     
    html = urllib2.urlopen(urllib2.Request('http://google.fr/search?q=tyrtamos', None, {'User-Agent': 'MyBrowser/0.1'})).read()
     
    print html
    Après, pour extraire les données du texte html, il faut utiliser un parser html (le texte html est un texte arborescent avec des tags, qui fonctionne comme du xml avec quelques particularités). Il existe un module HTMLParser livré avec Python, mais on dit aussi beaucoup de bien de BeautifulSoup (http://www.crummy.com/software/BeautifulSoup/).

    Avec PyQt4, on peut faire un navigateur web complet, aussi je pense que les fonctions existent pour faire la même chose qu'avec Python pur, mais je n'ai jamais cherché.
    Un expert est une personne qui a fait toutes les erreurs qui peuvent être faites, dans un domaine étroit... (Niels Bohr)
    Mes recettes python: http://www.jpvweb.com

  7. #7
    Membre averti
    Femme Profil pro
    Ingénieur informatique scientifique
    Inscrit en
    Mai 2010
    Messages
    313
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 34
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur informatique scientifique
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Mai 2010
    Messages : 313
    Points : 301
    Points
    301
    Par défaut
    D'accord je comprends mieux,
    effectivement avec cette solution je devrais pouvoir arriver à ce que je veux!
    Merci beaucoup

  8. #8
    Membre averti
    Femme Profil pro
    Ingénieur informatique scientifique
    Inscrit en
    Mai 2010
    Messages
    313
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 34
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur informatique scientifique
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Mai 2010
    Messages : 313
    Points : 301
    Points
    301
    Par défaut
    cela fonctionne bien, pour ceux que ça intéresse voici mon code (ici, je fais une requête de lecture pour récupérer toutes les valeurs du champ 'titre' de ma table 'actualites'):

    Mon fichier executeRequete.php, situé sur mon serveur 1&1:
    Code php : 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
    <!DOCTYPE html>
    <html>
    <!-- Script pour la communication entre la BDD et l'appli PyQt -->
     
    <head>
        [...]
    </head>
     
    <body>
    <?php
     
        if (isset($_GET['requete']))
    	{
            //Connexion a la base de donnees
            $bdd = new PDO('mysql:host="monHote";dbname="maDbName"','userName','Password');
     
            //Execution de la requete
            $req = $bdd->query($_GET['requete']);
     
            //Affichage des resultats
            while($donnees = $req->fetch())
            {
                echo '<p>'.$donnees['titre'].'</p><br />';
            }
            $req->closeCursor();
        }
        else
        {
            echo "<p>Erreur</p>";
        }
    ?>
    </body>
    </html>

    Mon fichier testLectureBDD.py situé sur mon PC:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    #-*-coding: utf-8 -*-
    from PyQt4.QtSql import *
    from PyQt4.QtCore import *
    from PyQt4.QtGui import *
    import os, sys
    import urllib2
     
    if __name__=="__main__":
        app = QApplication(sys.argv)
     
        requete = "SELECT+titre+FROM+actualites"
        html = urllib2.urlopen(urllib2.Request('http://www.monSite.com/executeRequete.php?requete=' + requete, None, {'User-Agent': 'MyBrowser/0.1'})).read()
        print html
    A noter qu'il faut remplacer les espaces par des '+' dans la requete afin qu'elle soit correctement interprétée par le script php.
    Le print de mon programme python me revoie alors bien le contenu de la page HTML créée:

    Code html : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    <!DOCTYPE html>
    <html>
    <!-- Script pour la communication entre la BDD et l'appli PyQt -->
     
    <head>
        [...]
    </head>
     
    <body>
    <p>Titre 1</p>
    <p>Titre 2</p>
    <p>Titre 3</p>
    </body>
    </html>

    Il ne reste alors plus qu'à récupérer les données 'Titre 1', 'Titre 2' et 'Titre 3' avec HTMLParser ou BeautifulSoup!

  9. #9
    Expert éminent
    Avatar de tyrtamos
    Homme Profil pro
    Retraité
    Inscrit en
    Décembre 2007
    Messages
    4 462
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2007
    Messages : 4 462
    Points : 9 249
    Points
    9 249
    Billets dans le blog
    6
    Par défaut
    Bravo!

    [Edit] Dans un cas aussi simple, on peut extraire les réponses du texte html non pas avec un parser html, mais avec les expressions régulières:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    import re
     
    motif = r"<p>(.*?)</p>"
    print re.findall(motif, html) 
    ['Titre 1', 'Titre 2', 'Titre 3']
    Un expert est une personne qui a fait toutes les erreurs qui peuvent être faites, dans un domaine étroit... (Niels Bohr)
    Mes recettes python: http://www.jpvweb.com

  10. #10
    Responsable Qt & Livres


    Avatar de dourouc05
    Homme Profil pro
    Ingénieur de recherche
    Inscrit en
    Août 2008
    Messages
    26 619
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur de recherche
    Secteur : Enseignement

    Informations forums :
    Inscription : Août 2008
    Messages : 26 619
    Points : 188 594
    Points
    188 594
    Par défaut
    Fais quand même extrêmement attention à ce que tu fais : là, n'importe qui ayant l'URL peut effectuer n'importe quelle requête SQL sur ta base. Par exemple, tout supprimer.

    Il me semble plus sécurisé de passer un identifiant de requête :

    Code php : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    switch($_GET['request']) {
    case 'news.title.get': 
        $req = 'SELECT titre FROM actualites';
    // …
    }

    Dès que la requête effectuera des modifications en base, il faudra être encore plus vigilant avec une authentification (ne pas envoyer les codes pour l'accès à la base de données en clair, donc pas dans l'URL, si jamais tu y pensais). Là, il faudra développer un service Web un tant soit plus compliqué (avec OAuth, par exemple).

    Citation Envoyé par tyrtamos Voir le message
    Dans un cas aussi simple, on peut extraire les réponses du texte html non pas avec un parser html, mais avec les expressions régulières:
    Mieux encore : éviter de jouer de la sorte, n'émettre sur la page que ce qu'il faut, sérialisé d'une manière standard et non ambiguë. Par exemple, que le script renvoie les données sous la forme d'un objet JSON. Ainsi, si la base de données renvoie une liste de titres, récupérer une liste dans le script Python sera beaucoup plus simple (sinon, aller trifouiller dans le texte récupéré, espérer qu'il y ait des séparateurs entre chaque item, espérer que chaque titre ne contienne pas le séparateur…).
    Vous souhaitez participer aux rubriques Qt (tutoriels, FAQ, traductions) ou HPC ? Contactez-moi par MP.

    Créer des applications graphiques en Python avec PyQt5
    Créer des applications avec Qt 5.

    Pas de question d'ordre technique par MP !

  11. #11
    Membre averti
    Femme Profil pro
    Ingénieur informatique scientifique
    Inscrit en
    Mai 2010
    Messages
    313
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 34
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur informatique scientifique
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Mai 2010
    Messages : 313
    Points : 301
    Points
    301
    Par défaut
    En effet j'étais en train de me poser cette question de la sécurité par rapport au fait d'envoyer des requêtes SQL dans mon URL.
    Très bonne idée le principe des identifiants de requête, et les objets JSON ont l'air intéressants, je vais regarder ça de plus près.
    Merci!

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

Discussions similaires

  1. [MySQL] Connexion à une base de donnée en ligne
    Par ghost emperor dans le forum VB.NET
    Réponses: 8
    Dernier message: 05/12/2007, 14h09
  2. Réponses: 1
    Dernier message: 25/09/2005, 16h18
  3. ERREUR DE CONNEXION à une base de donnée ACCESS protégée
    Par unionriton dans le forum Bases de données
    Réponses: 4
    Dernier message: 09/05/2005, 09h35
  4. Delphi Connexion à une base de donnée distante par TCP/IP
    Par viecel dans le forum Bases de données
    Réponses: 1
    Dernier message: 12/01/2005, 19h19
  5. Réponses: 3
    Dernier message: 29/03/2004, 18h02

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