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

Python Discussion :

Génération de pages avec gabarit


Sujet :

Python

  1. #1
    Membre à l'essai
    Homme Profil pro
    Indépendant
    Inscrit en
    Février 2016
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Cantal (Auvergne)

    Informations professionnelles :
    Activité : Indépendant

    Informations forums :
    Inscription : Février 2016
    Messages : 5
    Points : 10
    Points
    10
    Par défaut Génération de pages avec gabarit
    Bonjour,
    je n'ai pas réussi à trouver beaucoup d'informations sur la génération de fichiers à partir d'un gabarit et de données, via Python. J'aurais besoin de générer quelques pages (web à plat, c'est du dokuwiki) à partir de données que je manipule avec du Python.

    Je suis débutant en programmation (Python est mon premier langage), et je ne sais pas toujours bien où chercher, donc je me disais que certains ici pourraient m'aiguiller vers un outil pas trop complexe, ou me dire ce qu'ils pensent de Chameleon (c'est le seul dont j'ai trouvé de la doc qui me semble à ma portée).

    J'ai donc des données (sous forme de listes en général) que je voudrais placer ici et là, avec des conditions éventuellement, dans des gabarits de page prédéfinis. Tant qu'à faire, j'aimerais un système qui supporte la montée en puissance ou suffisamment versatile pour que je puisse ensuite monter en compétence personnellement. L'autoformation n'est jamais inutile il me semble, même et surtout quand on n'est pas professionnel de la profession comme disait l'autre.

    En vous remerciant par avance de toute aide éventuelle, cordialement.

  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,

    Je ne sais pas si ça répond à la question, mais dans un de mes programmes, je crée des courriers personnalisés à base de données injectées dans des textes en html.

    Voilà le principe:

    Avec un éditeur html (j'utilise kompozer), je crée le texte html.

    Je reprends le script source html, et je le modifie: chaque emplacement du script devant recevoir des données doit avoir un "{}". Il ne reste plus qu'une méthode .format pour injecter les données.

    Voilà un petit exemple:

    J'écris le texte suivant:

    titre

    Mr xxx yyy

    gfdvhgvhdfvhfd
    vhfdvhfdvhfdvh
    vhfvdhfdvhfdvh
    hjgfdvhjgfdbhgf

    Cordialement

    Machin
    L'emplacement des futures données est marqué avec 'xxx' et 'yyy'.

    Je reprends le source html, je le copie dans une page de programme Python, et je remplace les 'xxx' et 'yyy' par des '{}':

    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
    html = """
    <html>
    <head>
    <meta content="text/html; charset=ISO-8859-1"
    http-equiv="content-type">
    <title></title>
    </head>
    <body>
    titre<br>
    <br>
    Mr {} {}<br>
    <br>
    gfdvhgvhdfvhfd<br>
    vhfdvhfdvhfdvh<br>
    vhfvdhfdvhfdvh<br>
    hjgfdvhjgfdbhgf<br>
    <br>
    Cordialement<br>
    <br>
    Machin<br>
    <br>
    <br>
    </body>
    </html>
    """.format("Durand", "Alain")
     
    with open("texte.html", 'w', encoding='utf-8') as fd:
        fd.write(html+'\n')
    Il suffit ensuite d'afficher le fichier html obtenu dans n'importe quel navigateur web pour obtenir:

    titre

    Mr Durand Alain

    gfdvhgvhdfvhfd
    vhfdvhfdvhfdvh
    vhfvdhfdvhfdvh
    hjgfdvhjgfdbhgf

    Cordialement

    Machin
    Bien sûr, ça peut être une injection beaucoup plus riche, comme d'injecter des données dans un tableau html! Mais il faut connaître un peu le html pour ça.

    En ce qui me concerne, je vais plus loin en utilisant le html obtenu pour fabriquer des pages pdf grâce à la bibliothèque graphique PyQt. Ça me permet de gérer des pages finement avec en-têtes, bas de pages et rupture de pages pour obtenir, si nécessaire, des courriers imprimés avec une belle présentation. Il y a 2 jours, je viens de fabriquer comme ça 470 pdf personnalisés que j'ai envoyé par email à 470 destinataires situés dans 43 pays (réponses à un concours international). Mais la partie PyQt est très complexe si vous débutez en programmation.
    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 à l'essai
    Homme Profil pro
    Indépendant
    Inscrit en
    Février 2016
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Cantal (Auvergne)

    Informations professionnelles :
    Activité : Indépendant

    Informations forums :
    Inscription : Février 2016
    Messages : 5
    Points : 10
    Points
    10
    Par défaut
    Bonjour,
    merci de cette réponse détaillée. En fait je me débrouille comme ça avec .format pour l'instant mais je ne sais pas si on peut intégrer des conditions aisément sans rendre le code Python trop complexe. Car je vais avoir pas mal de conditions pour remplir le document. Je pars de documents xml du type :
    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
     
    <?xml version="1.0"?>
    <DFN Revision="$Revision: 1.14 $" State="modified">
      <ELEMENT Name="basics" Type="Dfn" Filename="_item_basics.dfn"/>
      <ELEMENT Name="armor" Type="Dfn" Filename="_item_armor.dfn"/>
      <ELEMENT Name="melee weapon" Type="Dfn" Filename="_item_melee_weapon.dfn"/>
      <ELEMENT Name="range weapon" Type="Dfn" Filename="_item_range_weapon.dfn"/>
      <ELEMENT Name="ammo" Type="Dfn" Filename="_item_ammo.dfn"/>
      <ELEMENT Name="mp" Type="Dfn" Filename="_item_mp.dfn"/>
      <ELEMENT Name="shield" Type="Dfn" Filename="_item_shield.dfn"/>
      <ELEMENT Name="crafting tool" Type="Dfn" Filename="_item_crafting_tool.dfn"/>
      <ELEMENT Name="harvest tool" Type="Dfn" Filename="_item_harvest_tool.dfn"/>
      <ELEMENT Name="taming tool" Type="Dfn" Filename="_item_taming_tool.dfn"/>
      <ELEMENT Name="teleport" Type="Dfn" Filename="_item_teleport.dfn"/>
      <ELEMENT Name="bag" Type="Dfn" Filename="_item_bag.dfn"/>
      <ELEMENT Name="pet" Type="Dfn" Filename="_item_pet.dfn"/>
      <ELEMENT Name="food" Type="Dfn" Filename="_item_food.dfn"/>
      <ELEMENT Name="guild option" Type="Dfn" Filename="_item_guild_option.dfn"/>
      <ELEMENT Name="3d" Type="Dfn" Filename="_item_3d.dfn"/>
      <ELEMENT Name="Alias" Type="Type" Filename="string.typ"/>
      <ELEMENT Name="Consumable" Type="Dfn" Filename="_item_consumable.dfn"/>
      <ELEMENT Name="Xp Catalyser" Type="Dfn" Filename="_item_xp_catalyser.dfn"/>
      <ELEMENT Name="Cosmetics" Type="Dfn" Filename="_item_cosmetics.dfn"/>
      <ELEMENT Name="service" Type="Dfn" Filename="_item_service.dfn"/>
      <ELEMENT Name="Scroll" Type="Dfn" Filename="_item_scroll.dfn"/>
      <ELEMENT Name="Effects" Type="Dfn" Filename="_item_effects.dfn"/>
      <ELEMENT Name="CommandTicket" Type="Dfn" Filename="_item_command_ticket.dfn"/>
      <COMMENTS>Converted from old format</COMMENTS>
      <LOG></LOG>
    </DFN>
    Pour générer une page du genre :
    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
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
     
    ====== sitem.dfn ======
     
    Situé dans : ''/DFN/game_elem/''
     
    ===== basics =====
    Sous ensemble de caractéristiques (basées sur [[fr:ds:sitem:rcdsdfn_item_basics|_item_basics.dfn]])
     
    ===== armor =====
    Sous ensemble de caractéristiques (basées sur [[fr:ds:sitem:rcdsdfn_item_armor|_item_armor.dfn]])
     
    ===== melee weapon =====
    Sous ensemble de caractéristiques (basées sur [[fr:ds:sitem:rcdsdfn_item_melee_weapon|_item_melee_weapon.dfn]])
     
    ===== range weapon =====
    Sous ensemble de caractéristiques (basées sur [[fr:ds:sitem:rcdsdfn_item_range_weapon|_item_range_weapon.dfn]])
     
    ===== ammo =====
    Sous ensemble de caractéristiques (basées sur [[fr:ds:sitem:rcdsdfn_item_ammo|_item_ammo.dfn]])
     
    ===== mp =====
    Sous ensemble de caractéristiques (basées sur [[fr:ds:sitem:rcdsdfn_item_mp|_item_mp.dfn]])
     
    ===== shield =====
    Sous ensemble de caractéristiques (basées sur [[fr:ds:sitem:rcdsdfn_item_shield|_item_shield.dfn]])
     
    ===== crafting tool =====
    Sous ensemble de caractéristiques (basées sur [[fr:ds:sitem:rcdsdfn_item_crafting_tool|_item_crafting_tool.dfn]])
     
    ===== harvest tool =====
    Sous ensemble de caractéristiques (basées sur [[fr:ds:sitem:rcdsdfn_item_harvest_tool|_item_harvest_tool.dfn]])
     
    ===== taming tool =====
    Sous ensemble de caractéristiques (basées sur [[fr:ds:sitem:rcdsdfn_item_taming_tool|_item_taming_tool.dfn]])
     
    ===== teleport =====
    Sous ensemble de caractéristiques (basées sur [[fr:ds:sitem:rcdsdfn_item_teleport|_item_teleport.dfn]])
     
    ===== bag =====
    Sous ensemble de caractéristiques (basées sur [[fr:ds:sitem:rcdsdfn_item_bag|_item_bag.dfn]])
     
    ===== pet =====
    Sous ensemble de caractéristiques (basées sur [[fr:ds:sitem:rcdsdfn_item_pet|_item_pet.dfn]])
     
    ===== food =====
    Sous ensemble de caractéristiques (basées sur [[fr:ds:sitem:rcdsdfn_item_food|_item_food.dfn]])
     
    ===== guild option =====
    Sous ensemble de caractéristiques (basées sur [[fr:ds:sitem:rcdsdfn_item_guild_option|_item_guild_option.dfn]])
     
    ===== 3d =====
    Sous ensemble de caractéristiques (basées sur [[fr:ds:sitem:rcdsdfn_item_3d|_item_3d.dfn]])
     
    ===== Alias =====
    //Chaîne de caractères//
    \\ Exemple : //Alias//
     
    ===== Consumable =====
    Sous ensemble de caractéristiques (basées sur [[fr:ds:sitem:rcdsdfn_item_consumable|_item_consumable.dfn]])
     
    ===== Xp Catalyser =====
    Sous ensemble de caractéristiques (basées sur [[fr:ds:sitem:rcdsdfn_item_xp_catalyser|_item_xp_catalyser.dfn]])
     
    ===== Cosmetics =====
    Sous ensemble de caractéristiques (basées sur [[fr:ds:sitem:rcdsdfn_item_cosmetics|_item_cosmetics.dfn]])
     
    ===== service =====
    Sous ensemble de caractéristiques (basées sur [[fr:ds:sitem:rcdsdfn_item_service|_item_service.dfn]])
     
    ===== Scroll =====
    Sous ensemble de caractéristiques (basées sur [[fr:ds:sitem:rcdsdfn_item_scroll|_item_scroll.dfn]])
    ===== Effects =====
    Sous ensemble de caractéristiques (basées sur [[fr:ds:sitem:rcdsdfn_item_effects|_item_effects.dfn]])
     
    ===== CommandTicket =====
    Sous ensemble de caractéristiques (basées sur [[fr:ds:sitem:rcdsdfn_item_command_ticket|_item_command_ticket.dfn]])
     
     
    {{tag>dfn sitem}}
    Ceci en sachant, bien évidemment, que le nombre d'entrées varie, que cela peut être un autre genre :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    <ELEMENT Name="Effect1" Type="Type" Filename="string.typ"/>
    Pour donner, par exemple :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    ===== Effect1 =====
    //Chaîne de caractère//
    \ Exemple : // //
    J'ai peur de monter une usine à gaz si tout est à la base de ''if'' ... ''.format''

  4. #4
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 283
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Architecte technique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2008
    Messages : 21 283
    Points : 36 770
    Points
    36 770
    Par défaut
    Salut,

    Citation Envoyé par YannK2 Voir le message
    Je suis débutant en programmation (Python est mon premier langage), et je ne sais pas toujours bien où chercher, donc je me disais que certains ici pourraient m'aiguiller vers un outil pas trop complexe, ou me dire ce qu'ils pensent de Chameleon (c'est le seul dont j'ai trouvé de la doc qui me semble à ma portée).
    Le "bon" outil dépend de la complexité de ce que vous allez faire côté template. Vous pouvez commencer avec string.Template de la bibliothèque standard.
    EN fonction de vos besoins, vous avez une liste d'outils plus ou moins adaptés dans le wiki Python.

    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  5. #5
    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
    Ce que je ferais dans ce cas, c'est une mise en commun de la partie qui se répète.

    Dans le script html, il y aura une en-tête:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    entete = """
    ...
    ...
    """
    Une findepage:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    findepage = """
    ...
    ...
    """
    Et la partie commune qui se répètera autant de fois qu'il y aura de nouvelles données à injecter. C'est cette partie qui aura les '{}':

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    corps = """
    ...{}...
    ..{}....
    """
    La structure générale du script Python sera donc en gros:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    html = entete
     
    for datas in ...:
        html += corps.format(datas)  
     
    html += findepage
    Même s'il y a des variantes dans le corps, ou même plusieurs corps en fonction du "type", ce sera toujours plus simple que de vouloir faire une page complète d'un seul coup.
    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

  6. #6
    Membre à l'essai
    Homme Profil pro
    Indépendant
    Inscrit en
    Février 2016
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Cantal (Auvergne)

    Informations professionnelles :
    Activité : Indépendant

    Informations forums :
    Inscription : Février 2016
    Messages : 5
    Points : 10
    Points
    10
    Par défaut
    Je vais regarder en découpant, en effet, je n'y avais pas pensé, merci.

    Par contre, si d'autres ont des retours sur la génération de documents par gabarits par l'un pu l'autre des systèmes détaillés dans la liste, ça m'intéresse.

Discussions similaires

  1. Réponses: 0
    Dernier message: 01/07/2008, 16h16
  2. Réponses: 13
    Dernier message: 16/04/2004, 12h00
  3. [UML] génération de code avec omondo.uml
    Par RENAULT dans le forum Eclipse Java
    Réponses: 3
    Dernier message: 31/10/2003, 13h14
  4. Récupérer le code HTML d'une page avec Delphi 7
    Par PsyKroPack dans le forum Web & réseau
    Réponses: 5
    Dernier message: 06/02/2003, 21h56

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