【问题标题】:Google App Engine WebApp2 template not workingGoogle App Engine WebApp2 模板不起作用
【发布时间】:2017-10-04 16:54:56
【问题描述】:

我正在学习 Google App Engine,并开始使用 WebApp2 框架 + Jinja2 模板。

我写了以下代码:

Main.py

import webapp2
import os
import jinja2
from google.appengine.ext.webapp import template
from google.appengine.api import users
from google.appengine.ext import ndb



template_dir = os.path.join(os.path.dirname(__file__), 'templates')
jinja_env = jinja2.Environment(loader = jinja2.FileSystemLoader(template_dir))



class Handler(webapp2.RequestHandler):
    def write(self, *a, **kw):
        self.response.out.write(*a, **kw)

    def render_str(self, template, **params):
        t = jinja_env.get_template(template)
        return t.render(params)

    def render(self, template, **kw):
        self, write(self.render_str(template, **kw))


class MainHandler(webapp2.RequestHandler):
    def get(self):
        self.response.write('Hello world!')


class PageOne(Handler):
    def get(self):
        self.render('pageone.html')

app = webapp2.WSGIApplication([('/', MainHandler),('/pageone', PageOne)], debug=True)

app.yaml

application: tbapp
version: 1
runtime: python27
api_version: 1
threadsafe: yes

handlers:
- url: /favicon\.ico
  static_files: favicon.ico
  upload: favicon\.ico

- url: .*
  script: main.app

libraries:
- name: webapp2
  version: "2.5.2"

- name: jinja2
  version: latest

templates 文件夹中还有一个 pageone.html HTML 文件。

现在,当我运行文件时,主页面显示 Hello world!。但是,当我运行 http://localhost:8080/pageone..... 它返回以下错误..

 File "E:\gae_apps\tbapp\tbapp\main.py", line 50, in get
    self.render('pageone.html')
  File "E:\gae_apps\tbapp\tbapp\main.py", line 40, in render
    self, write(self.render_str(template, **kw))
NameError: global name 'write' is not defined

谁能指导我,我做错了什么。我无法弄清楚。 TIA

【问题讨论】:

  • self, write 应该是self.write
  • @Amber 我非常感谢你...非常感谢!...这对我来说真的很愚蠢

标签: google-app-engine jinja2 webapp2


【解决方案1】:

正如 Amber 所指出的,您的 Handlerrender 方法中有错字。

替换

def render(self, template, **kw):
    self, write(self.render_str(template, **kw))

def render(self, template, **kw):
    self.write(self.render_str(template, **kw))

错误信息确实给了你一个提示

NameError: global name 'write' is not defined

【讨论】: