2011-03-19 50 views
1

我正在使用App Engine的web应用程序。这个请求处理程序输出一个带有文本字段的表单。提交后,它将获取文本并将<h1>标记添加到以#开头的行。我使用repr()可以将文本拆分为行列表,并且eval()可以分析来自repr()的字符串开头的每行没有u'的文本。appengine上的Python: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)) 

方式的代码是现在,它给我这个错误:

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

如果我使用的只是line[0]代替eval(line)[0],一切工作只是罚款,它并没有在第一线工作。即使第一行以#开头,但条件将为else,因为第一个字符将是u'而不是#。试图解决这个问题与eval()是给我这个错误。我该如何解决这个问题?

+0

如果我读了这个权利,您正在使用'eval()'输入从我们收到的b形式?这是一个等待发生的安全问题。 'eval'实际上是以Python代码的形式执行字符串的。 – dappawit 2011-03-19 05:05:00

+0

是的,现在我意识到这是一个坏主意。我只是不知道'splitlines()',所以这是我能想到的唯一方法。 – 2011-03-19 05:14:57

回答

4

要拆分的文本,字符串都内置splitlines方法:

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

然后,看是否有特定的行以#开始,试试这个:

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

放在一起:

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

那很快。谢谢! – 2011-03-19 05:13:31

+0

没问题,很高兴我可以帮助:) – dappawit 2011-03-19 05:17:37