我现在正在学习Google App Engine,上面写着“使用Charles Severance使用Google App Engine”一书。
我在第6章,到目前为止,我在模板文件夹中创建了app.yaml
,index.py
,index.html
,在静态文件夹中创建了CSS文件。
我的index.py
看起来像这样:
import os
import wsgiref.appengine.ext import webapp
from google.appengine.ext import webapp
from google.appengine.ext.webapp import template
class MainHandler(webapp.RequestHandler):
def get(self):
path=self.request.path
temp=os.path.join(os.path.dirname(__file__, 'templates' + path)
if not os.path.isfile(temp):
temp=os.path.join(os.path.dirname(__file__, 'templates/index.html')
self.response.out.write(template.render(temp,{}))
def main():
application = webapp.WSGIApplication([('/.*', MainHandler)], debug=True)
wsgiref.handlers.CGIHandler().run(application)
if __name == '__main__':
main()
为什么我收到此错误?
Traceback (most recent call last):
File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/wsgiref/handlers.py", line 86, in run
self.finish_response()
File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/wsgiref/handlers.py", line 127, in finish_response
self.write(data)
File "/System/Library/Frameworks/Python.framework/Versions/2.7/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
答案 0 :(得分:5)
由于一些旧的Google App Engine示例代码,我最近也遇到了这个确切的错误。我的问题出现在doRender()
函数中,其中outstr
对象是django.utils.safestring.SafeUnicode
对象,因此write()
函数正在抱怨。所以我通过unicode()
传递了一个write()
可以使用的unicode对象。
def doRender(handler, tname="index.html", values={}):
temp = os.path.join(os.path.dirname(__file__),
'templates/' + tname)
if not os.path.isfile(temp):
return False
# Make a copy of the dictionary and add the path
newval = dict(values)
newval['path'] = handler.request.path
outstr = template.render(temp, newval)
handler.response.out.write(unicode(outstr))
return True
答案 1 :(得分:0)
第2行:将import wsgiref.appengine.ext import webapp
更改为import wsgiref
。
第9行:在)
__file__
第11行:在)
__file__
第19行:将__name
更改为__name__
这些都是基本的语法错误。你刚从书中复制错了。始终通过App Engine SDK提供的开发服务器dev_appserver.py运行新代码。