2011-12-19 1 views
1

Я использую среду webapp2 в Google App Engine, и у меня возникает основная ошибка в одном из моих обработчиков запросов.Ошибка в развернутом GAE RequestHandler с использованием Webapp2

приложение работает нормально в локальном экземпляре, но вызывает следующий отслеживающий на развернутой версии Google App Engine:

Вот код:

import os 
from google.appengine.ext.webapp import template 
import webapp2 
import logging 

class MainHandler(webapp2.RequestHandler): 
    def get(self): 
     logging.info('hi there 34') 
     template_values = {} 
     self.response.out.write('hello world 4') 
     path = os.path.join(os.path.dirname(__file__), 'index.html') 

     ## This is the code that causes the bug ## 
     self.response.out.write(template.render(path, template_values)) 
     ## ## ## ## 

debug = os.environ.get('SERVER_SOFTWARE', '').startswith('Dev') 

app = webapp2.WSGIApplication(
    [(r'/main', MainHandler)], 
    debug = debug) 

def main(): 
    app.run() 

ошибка отслеживающий:

Traceback (most recent call last): 

File "/base/python27_runtime/python27_dist/lib/python2.7/wsgiref/handlers.py", 
line 86, in run 

self.finish_response() 
File "/base/python27_runtime/python27_dist/lib/python2.7/wsgiref/handlers.py", 
line 127, in finish_response 

self.write(data) 

File "/base/python27_runtime/python27_dist/lib/python2.7/wsgiref/handlers.py", 
line 202, in write 

assert type(data) is StringType,"write() argument must be string" 

AssertionError: write() argument must be string 

Что означает эта ошибка?

ответ

2

Я думаю, что ответ не принимает Юникод данных, так что вы должны encode это первое:

content = template.render(path, template_values) 
self.response.out.write(content.encode('utf-8')) 

Также рекомендую Werkzeug. Он отлично работает на appengine и делает жизнь намного проще. Он помогает обрабатывать данные запроса и ответа, маршрутизацию URL-адресов, предоставляет исключения для HTTP, имеет отличный отладчик для автономной разработки и многое другое. Я думаю, что Werkzeug должен иметь для каждого веб-разработчика python свои панели инструментов.

+0

Спасибо за ответ. Обычно с GAE мне никогда не приходилось кодировать в utf-8. Однако ваш ответ заставил меня подумать о файле html, который отображается для ответа. Мой редактор кода автоматически вставил html-разметку, чтобы html в utf-8. И это был первый раз, когда эта разметка была в html-файле, и в первый раз я вижу эту конкретную ошибку. Но, увы, такая же ошибка повторяется с этой разметкой или нет. И путем кодирования, как вы предполагали, и без него. Однако я подтвердил ваш ответ, потому что я думаю, что это была хорошая догадка, которая может принести пользу другим. Любые другие идеи? –

+1

Я только что повторил это, выставив отображаемое значение шаблона в строку, и он работал нормально. Не уверен, однако, в чем причина, так как это первый раз, когда я должен был это сделать. Как правило, в моих предыдущих приложениях, а также во всех примерах в документах GAE, template.render (путь, значения) работает так, как есть. Еще раз спасибо за указание на направление кодирования текста! –

+0

Jinja2 не поддерживает utf-8 bytestrings. 'Template.render' всегда возвращает строку unicode. Если вы передаете строку un unicode с символами non ascii в шаблон jinja, вы получите ошибки в Юникоде. – Ski

Смежные вопросы