2011-07-03 5 views
1

J'ai un excellent programme en ligne de commande qui imprime sur stdout. Je veux laisser les gens gérer ça à travers CGI. Dans la version CGI, je veux avoir la même sortie (avec "<BR>" au lieu de "\n").Python CGI: Traduire de stdout en html (par exemple remplacer n par <BR>)

Mon cgi_main fonctionne en appelant my real_main; Il y a beaucoup d'options à traiter et il était mauvais de le faire plusieurs fois. Mais depuis real_main appelle print, je ne sais pas comment changer "\n" à "<BR>" post hoc.

Je pourrais facilement changer toutes les instances de print pour aller à un tempfile et ensuite vider cela à la fin, mais il semble inélégant de changer tellement la version de la ligne de commande existante.

Une option consiste à appeler real_main une autre fonction (en passant argv); cette nouvelle fonction renvoie des valeurs. Ensuite, real_main imprime ces valeurs. cgi_main appelle la même fonction, mais imprime les valeurs différemment.

Une autre option consiste à utiliser une classe/fonction statique partout où j'utilise print maintenant. Cette classe pourrait être dit s'il faut reformater ou non. Passer ensuite d'une ligne de commande à une sortie CGI nécessiterait simplement de changer l'argument reform.

Voici un exemple de la façon dont je pensais que cette classe et la fonction pourrait fonctionner: cgi_tools classe: DEF initialisation (auto, réforme = False): self.reform = réforme def myPrint (self, * args): sinon self.reform: print (args) pour i, x dans énumération (args): si type (x) == str: self.myprint (x.replace ('\ n', '
')), type elif (x) dans les atomes: # vérifier si x est un atome (c.-à-d. Int, float, etc.): print x, autre: self.myprint (x), si i = len (args) -1: print '', print ''

Avec cela, je courais en difficulté en essayant de penser à tous les atomes (à savoir objets irréductibles) en Python. Je ne pouvais pas trouver une fonction intégrée pour ce test, et je pensais que l'écrire moi-même était une idée fragile.

J'ai essayé d'utiliser insepct d'imprimer le code source de print, mais je ne pouvais pas faire ça! impression sys.out.print:

import inspect 
print inspect.getsource(print) # this does not work! 

Tout cela semble être une question de CGI Python classique, mais je ne pouvais pas trouver une bonne solution. Je sais comment assembler les choses d'une manière bâclée et obtenir ce que je veux, mais j'aimerais beaucoup savoir comment être élégant. Je veux grandir, et je ne veux plus programmer de manière désordonnée.

Merci beaucoup pour vos idées et conseils. <br> -Oliver

+1

La source d'impression est en C, pas en python, c'est pourquoi inspect ne renvoie pas la source. – Avery3R

+1

pourquoi ne pas simplement envoyer un en-tête MIME texte/plain au lieu de texte/html? –

Répondre

2

Au début de votre script CGI, mis print "Content-type: text/plain\r\n\r\n". Le résultat s'affichera sur une page Web de la même manière que sur une console.En général, si je veux avoir deux variantes sur un programme, une qui met en forme la sortie en HTML et l'autre qui produit du texte brut, je résume autant que possible la logique dans les routines ou les objets qui ne produisent pas , puis avoir des routines de sortie distinctes pour les variations. Voir par exemple http://jcomeau.unternet.net/src/colorforth/as/cf2text, qui est symlinked à cf2html et cf2ansi; le même programme produit 3 sorties différentes en fonction du lien symbolique appelé. Notez qu'il s'agit d'un ancien code et que je ne programme plus de la même manière, mais peut-être que vous en aurez des idées utiles; peut être pas.

En fait, en regardant par-dessus le lien que je vous ai donné, j'ai utilisé une stratégie différente, en utilisant un global pour indiquer le style de sortie désiré. Je n'ai pas de code open source récent avec un meilleur exemple à vous donner, tout appartient à mes clients.

est ici une façon de modifier votre sortie sans changer vos déclarations d'impression:

>>> import sys, StringIO 
>>> oldout = sys.stdout 
>>> sys.stdout = newout = StringIO.StringIO() 
>>> for line in 'this', 'that', 'the other': print line 
... 
>>> sys.stdout = oldout 
>>> print newout.getvalue().replace('\n', '<br />\n') 
this<br /> 
that<br /> 
the other<br /> 

Si vous utilisez cette méthode, vous pouvez modifier votre type de contenu text/html et utiliser toute autre fonctionnalité HTML. Pour des modifications plus complexes de la sortie, vous pouvez utiliser une substitution d'expression régulière. Et si vous voulez que la sortie soit en lignes, vous pouvez:

>>> newout.seek(0) 
>>> newout.readlines() 
['this\n', 'that\n', 'the other\n'] 
+0

+1 Merci @jcomeau_ictx et excuses pour la question simple. En général, si je voulais faire d'autres remplacements (comme les listes apparaissent comme des tables en html, etc.), quelle serait la façon idéale de le faire? – user

+0

voir la mise à jour de la réponse. –

+0

À la vôtre. Y at-il un moyen de me laisser mettre tags et de les charger? – user

Questions connexes