2010-05-14 5 views
4

Récemment, j'avais besoin de générer une énorme page HTML contenant un rapport avec plusieurs milliers de lignes. Et, évidemment, je ne voulais pas construire tout le HTML (ou l'arbre sous-jacent) en mémoire. Comme résultat, j'ai construit la page avec l'ancienne bonne interpolation de chaîne, mais je n'aime pas la solution.Modèles Python pour HTML/XML énorme

Ainsi, je me demande s'il existe des moteurs de modélisation Python qui peuvent produire le contenu de la page résultant par des parties.

UPD 1: Je ne suis pas intéressé par la liste de tous les cadres disponibles et les moteurs de modèle. Je m'intéresse aux solutions de modélisation que je peux utiliser séparément de n'importe quel framework et qui peuvent générer du contenu par portions au lieu de construire le résultat entier en mémoire.

Je comprends les améliorations d'ergonomie du chargement de contenu partiel avec le script client, mais cela sort du cadre de ma question actuelle. Dites, je veux générer un énorme HTML/XML et le diffuser dans un fichier local.

+1

Je l'utilise http://www.cheetahtemplate.org/ – Anycorn

+0

@aaa: J'ai regardé la documentation sur le guépard récemment et y ai réfléchi, mais je n'ai pas remarqué d'exemple. Mako semble aussi capable d'écrire dans un fichier. – newtover

+0

bonjour. Je ne sais pas grand-chose sur makeo, ayant utilisé le guépard exclusivement pour générer de gros fichiers C++. la documentation pour guépard est approfondie, mais je ne me souviens pas de voir l'exemple complet. Au lieu de cela je l'ai appris en appliquant chaque extrait de la documentation à mon problème comme je suis allé. – Anycorn

Répondre

2

Il serait plus convivial (en supposant que javascript soit activé) pour construire la table via javascript en utilisant par exemple. un plugin jQuery qui permet le chargement automatique du contenu dès que vous faites défiler vers le bas. Ensuite, seules quelques lignes sont chargées initialement et lorsque l'utilisateur fait défiler plus de lignes sont chargées à la demande.

Si ce n'est pas une solution, vous pouvez utiliser trois modèles: un pour tout avant les lignes, un pour tout après les lignes et un troisième pour les lignes. Ensuite, vous devez d'abord envoyer le modèle avant-lignes, puis générer les lignes et les envoyer immédiatement, puis le modèle après-lignes. Alors vous aurez seulement un bloc/rangée dans la mémoire au lieu de la table entière.

+0

Eh bien, merci pour votre suggestion, mais malheureusement, cela ne répond pas à la question. – newtover

0

Utilisez-vous un framework Web pour cela? http://www.pylonshq.com inclut la compatibilité avec plusieurs moteurs de modèle. http://www.djangoproject.com/ Django a son propre langage de template.

Je pense qu'une réponse qui incluait le chargement paresseux des lignes avec javascript fonctionnerait pour la vue Web, mais je suppose que le rapport devra être imprimé, auquel cas vous devrez construire le tout à un certain niveau. point, n'est-ce pas?

+0

Je suis désolé, j'ai mis à jour ma question. – newtover

+0

Si vous lisez le site Web pylons, vous pouvez consulter plusieurs modèles de langages qui existent indépendamment du framework. – UberAlex

2

Il n'y a aucun problème à construire quelque chose comme ça en mémoire. Plusieurs thoins et rangs ne sont en aucun cas grands.

Pour templating besoins, vous pouvez utiliser l'une des:

Il existe sometools qui permettent la génération de code HTML à partir de ces langages de balisage.

+0

Merci. Je serais d'accord, que 10000 n'est pas si énorme dans mon cas (cela dépend du contenu), mais si je prenais des données de MySQL, par exemple, la taille pourrait doubler. Quoi qu'il en soit, votre suggestion est de générer des données dans un format intermédiaire, puis d'appliquer une transformation avec l'un des outils listés, n'est-ce pas? J'ai remarqué, certaines des solutions ne sont même pas basées sur Python. – newtover

+0

Oui, des choses comme RST peuvent être générées de façon beaucoup plus succincte que HTML. Il suffit ensuite d'appeler un outil tiers pour le convertir en HTML. Je crois que tous les exemples que j'ai fournis DO ont une librairie python. Un autre avantage du format intermédiaire - est que vous pouvez facilement créer des applications supplémentaires comme: représentation XML, ou même l'exposer comme une API de quelque sorte (mais ce n'est pas la question). – drozzy

+0

En ce qui concerne le double de la taille de la requête de la base de données - vous pouvez facilement stocker beaucoup plus de 20k enregistrements en mémoire. Dans le cas où vous n'êtes pas capable de le faire, vous pouvez l'écrire dans un fichier (dans une représentation intermédiaire ou csv), puis le convertir en html, xml ou autre chose. La partie la plus lente sera la requête de la base de données (plus le décalage réseau s'il y en a) donc je ne m'inquiéterais pas de l'écriture/lecture dans un fichier + processus de conversion. Je suggère d'exécuter quelques tests avec des fichiers de 1 million de lignes ou plus, en les convertissant de RST par exemple en HTML avec quelque chose comme Sphinx. – drozzy

1

Vous n'avez pas besoin d'un moteur de templating en streaming - Je le fais tout le temps, et bien avant vous rencontrez quelque chose de côté serveur vaguement lourd, le navigateur va commencer à étouffer. Le rendu d'une table de 10 000 lignes arrime le processeur pendant plusieurs secondes dans à peu près tous les navigateurs; en le faisant défiler, il sera agité de façon agitée en chrome, et l'utilisation du navigateur augmentera quel que soit le navigateur. Ce que vous pouvez faire (et que j'ai déjà implémenté, même si rétrospectivement, il s'avère ne pas être nécessaire) est d'utiliser xslt côté client. L'impression de l'instruction de traitement xslt et de l'étiquette d'ouverture et de fermeture à l'aide de chaînes est facile et relativement sûre; Vous pouvez ensuite diffuser chaque ligne en tant qu'élément xml autonome à l'aide de la technique d'écriture xml de votre choix.

Cependant - vous n'avez vraiment pas besoin de cela, et probablement jamais - si jamais votre générateur html devient trop lent, le navigateur sera d'un ordre de grandeur plus problématique. Donc, à moins que vous ne compariez cela et que vous ayez déterminé que vous avez vraiment un problème, ne perdez pas votre temps. Si vous avez un problème, vous pouvez le résoudre sans fondamentalement changer la méthode - dans la génération de la mémoire peut fonctionner très bien.

+0

C'est un bon commentaire, puisque la question est plus théorique pour moi.Je retourne en fait une grande table HTML qui se trouve être un XML valide en même temps destiné à être facilement utilisé pour l'automatisation. Dans ma situation, j'utiliserais un script XML qui écrit dans un fichier, mais il n'y en a aucun dans la bibliothèque std de Python. Je n'ai pas pensé au problème du côté du navigateur. Je vous remercie. – newtover

Questions connexes