2011-03-19 5 views
1

J'utilise la webapp d'App Engine. Ce gestionnaire de requêtes génère un formulaire avec un champ de texte. Lors de la soumission, il recevra le texte et ajoutera les balises <h1> aux lignes commençant par #. J'ai utilisé repr() pour pouvoir diviser le texte en une liste de lignes, et eval() pour analyser le texte de chaque ligne sans le u' au début de la chaîne qui vient de repr().Python sur appengine: erreur avec eval()

class Test(webapp.RequestHandler): 
    def get(self): 
     self.response.out.write('<form method=\'post\' action=\'\'>') 
     self.response.out.write('<textarea name=\'text\'></textarea>') 
     self.response.out.write('<input type=\'submit\' value=\'Submit\'/>') 
     self.response.out.write('</form>') 
    def post(self): 
     output = [] 
     for line in repr(self.request.get('text')).split('\\n'): 
      if eval(line)[0] == '#': 
       output.append('<h1>'+line+'</h1>') 
      else: 
       output.append(line) 
     self.response.out.write('\\n'.join(output)) 

La façon dont le code est maintenant, sa me donner cette erreur:

File "<string>", line 1 
    u'#somestring\r 
       ^
SyntaxError: EOL while scanning string literal 

Si je viens d'utiliser line[0] au lieu de eval(line)[0], tout fonctionne bien, sauf que cela ne fonctionne pas pour la première ligne . Même si la première ligne commence par #, le conditionnel ira pour le else car les premiers caractères seront u' et non #. Essayer de contourner cela avec eval() me donne cette erreur. Comment puis-je contourner ce problème?

+0

Si je lis bien, vous utilisez 'eval()' sur l'entrée reçue d'un nous forme b? C'est un problème de sécurité qui attend de se produire. 'eval' exécute réellement la chaîne en tant que code Python. – dappawit

+0

Oui, maintenant je réalise que c'était une mauvaise idée. Je ne connaissais tout simplement pas 'splitlines()', donc c'était la seule façon de le penser. –

Répondre

4

Pour diviser le texte, les cordes ont construit dans splitlines méthode:

for line in self.request.get('text').splitlines(): 
    ... do whatever ... 

ensuite si une ligne particulière commence par un #, essayez ceci:

if line.strip()[0]=='#': 
    ... do whatever ... 

Assemblez:

for line in self.request.get('text').splitlines(): 
    if line.strip()[0] == '#': 
     ... do whatever ... 
+0

Eh bien, c'était rapide. Merci! –

+0

Pas de problème, content de pouvoir aider :) – dappawit