【问题标题】:NameError: global name 'TemplateNotFound' is not definedNameError:未定义全局名称“TemplateNotFound”
【发布时间】:2014-04-03 19:04:53
【问题描述】:

我正在从融合表中收集一些数据到我的 python 代码中,并从那里尝试将这些数据可视化到地图上。为此,我正在使用 Jinja2。但是我收到了这个错误,我只是不明白为什么。这是我的代码

import webapp2
from webapp2_extras import jinja2
from webapp2_extras import json
import logging
import httplib2
from apiclient.discovery import build
import urllib
import numpy
from django.utils import simplejson
from itertools import chain
from collections import Counter
import math

# This API key is provided by google as described in the tutorial
API_KEY = '************************'

# This is the table id for the fusion table
TABLE_ID = '*************************'  
# I am specifying the right keys here

service = build('fusiontables', 'v1', developerKey=API_KEY)

class BaseHandler(webapp2.RequestHandler):
    @webapp2.cached_property
    def jinja2(self):
        # Returns a Jinja2 renderer cached in the app registry.
        return jinja2.get_jinja2(app=self.app)

    # lets jinja render our response
    def render_response(self, _template, context):
        values = {'url_for': self.uri_for}
        # logging.info(context)
        values.update(context)
        self.response.headers['Content-Type'] = 'text/html'

        # Renders a template and writes the result to the response.
        try: 
            rv = self.jinja2.render_template(_template, **values)
            self.response.headers['Content-Type'] = 'text/html; charset=utf-8'
            self.response.write(rv)
        except TemplateNotFound:
            self.abort(404)

class MainHandler(BaseHandler):

    def get(self):
        """default landing page"""
        logging.info("in get************************************************************************")
        data = self.get_all_data()
        columns = data['columns']
        rows = data['rows']
        print columns
        query = "SELECT USState, NOFU2008 FROM " + TABLE_ID 
        data2008 = service.query().sql(sql=query).execute()
        print data2008['columns']
        query = "SELECT USState, NOFU2009 FROM " + TABLE_ID 
        data2009 = service.query().sql(sql=query).execute()
        # print data2009
        query = "SELECT USState, NOFU2010 FROM " + TABLE_ID 
        data2010 = service.query().sql(sql=query).execute()

        variables = {"data2008": data2008 , "data2009": data2009, "data2010": data2010}
        print variables["data2009"]
        self.render_response('index.html', variables)

    def get_all_data(self):
        """ collect data from the server. """

        # open the data stored in a file called "data.json"
        try:
            fp = open("data/data.json")
            response = json.load(fp)
        # but if that file does not exist, download the data from fusiontables
        except IOError:
            service = build('fusiontables', 'v1', developerKey=API_KEY)
            query = "SELECT * FROM " + TABLE_ID
            response = service.query().sql(sql=query).execute()
            fp = open("data.json", "r")
            #json.dump(response, fp)
            return response

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

这就是我在我的 google appengine 启动器控制台中看到的内容。

Traceback (most recent call last):
  File "C:\Program Files (x86)\Google\google_appengine\lib\webapp2-2.5.2\webapp2.py", line 1535, in __call__
    rv = self.handle_exception(request, response, e)
  File "C:\Program Files (x86)\Google\google_appengine\lib\webapp2-2.5.2\webapp2.py", line 1529, in __call__
    rv = self.router.dispatch(request, response)
  File "C:\Program Files (x86)\Google\google_appengine\lib\webapp2-2.5.2\webapp2.py", line 1278, in default_dispatcher
    return route.handler_adapter(request, response)
  File "C:\Program Files (x86)\Google\google_appengine\lib\webapp2-2.5.2\webapp2.py", line 1102, in __call__
    return handler.dispatch()
  File "C:\Program Files (x86)\Google\google_appengine\lib\webapp2-2.5.2\webapp2.py", line 572, in dispatch
    return self.handle_exception(e, self.app.debug)
  File "C:\Program Files (x86)\Google\google_appengine\lib\webapp2-2.5.2\webapp2.py", line 570, in dispatch
    return method(*args, **kwargs)
  File "C:\Users\Yash\New folder\data\Assignments\jmankoff-byte3\main.py", line 63, in get
    self.render_response('index.html', variables)
  File "C:\Users\Yash\New folder\data\Assignments\jmankoff-byte3\main.py", line 40, in render_response
    except TemplateNotFound:
NameError: global name 'TemplateNotFound' is not defined
INFO     2014-03-02 17:49:26,928 module.py:612] default: "GET / HTTP/1.1" 500 1826

【问题讨论】:

    标签: python google-app-engine python-2.7 jinja2 nameerror


    【解决方案1】:

    您需要从jinja2 module 导入该异常:

    from jinja2 import TemplateNotFound
    

    或使用您的模块中已有的现有 jinja2 全局引用:

    except jinja2.TemplateNotFound:
    

    【讨论】:

    • 现在我收到以下错误 - TemplateAssertionError: no filter named 'self' 这可能是因为我试图访问 index.html 中的数据,如下所示 - var data = google.visualization。 arrayToDataTable({{data2008|self}});我不太确定这是如何工作的,所以我什至无法理解我的错误
    • 您的错误与您发布的模板代码无关。
    • 另外,对于新问题,最好发布一个新问题。请勿更改 this 问题,因为后续问题会使现有答案无效,从而无法进行投票。而且,我所在的地方已经过了午夜,一个新帖子会引起你的新关注。
    • 您原来的问题已经解决了。让您的问题保持原始状态,它可能会帮助其他人将来遇到同样的问题。
    猜你喜欢
    • 2011-04-27
    • 1970-01-01
    • 2014-10-24
    • 2012-05-29
    • 2013-08-23
    • 2017-05-12
    • 2015-09-01
    • 2012-03-10
    相关资源
    最近更新 更多