2012-06-13 8 views
5

Estoy intentando crear mi primera aplicación GAE con jinja2. Después de superar una docena de pequeños errores, ahora estoy atascado con esto:TemplateNotFound: index.html con Google App Engine y Jinja2

Rastreo (llamada más reciente pasado):

File "C:\Program Files (x86)\Google\google_appengine\lib\webapp2\webapp2.py", line 1536, in __call__ 
    rv = self.handle_exception(request, response, e) 
    File "C:\Program Files (x86)\Google\google_appengine\lib\webapp2\webapp2.py", line 1530, in __call__ 
    rv = self.router.dispatch(request, response) 
    File "C:\Program Files (x86)\Google\google_appengine\lib\webapp2\webapp2.py", line 1278, in default_dispatcher 
    return route.handler_adapter(request, response) 
    File "C:\Program Files (x86)\Google\google_appengine\lib\webapp2\webapp2.py", line 1102, in __call__ 
    return handler.dispatch() 
    File "C:\Program Files (x86)\Google\google_appengine\lib\webapp2\webapp2.py", line 572, in dispatch 
    return self.handle_exception(e, self.app.debug) 
    File "C:\Program Files (x86)\Google\google_appengine\lib\webapp2\webapp2.py", line 570, in dispatch 
    return method(*args, **kwargs) 
    File "C:\Users\CG\Documents\udacity\HiMon\main.py", line 31, in get 
    template = jinja_environment.get_template('index.html') 
    File "C:\Program Files (x86)\Google\google_appengine\lib\jinja2\jinja2\environment.py", line 719, in get_template 
    return self._load_template(name, self.make_globals(globals)) 
    File "C:\Program Files (x86)\Google\google_appengine\lib\jinja2\jinja2\environment.py", line 693, in _load_template 
    template = self.loader.load(self, name, globals) 
    File "C:\Program Files (x86)\Google\google_appengine\lib\jinja2\jinja2\loaders.py", line 115, in load 
    source, filename, uptodate = self.get_source(environment, name) 
    File "C:\Program Files (x86)\Google\google_appengine\lib\jinja2\jinja2\loaders.py", line 180, in get_source 
    raise TemplateNotFound(template) 
TemplateNotFound: index.html 

Aquí mi archivo YAML:

application: himother 
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.1" 
- name: jinja2 
    version: "2.6" 

Aquí mi código:

import os 
import webapp2 

import jinja2 

jinja_environment = jinja2.Environment(autoescape=True, 
    loader=jinja2.FileSystemLoader(os.path.join(os.path.dirname(__file__), 'templates'))) 

class MainPage(webapp2.RequestHandler): 
    def get(self): 
     template_values = { 
      'name': 'Serendipo', 
      'verb': 'extremely happy' 
     } 

     template = jinja_environment.get_template('index.html') 
     self.response.out.write(template.render(template_values)) 

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

Aquí mi plantilla html:

<!DOCTYPE html> 
<html> 
    <head> 
     <title>Look Ma, I'm using Jinja!</title> 
    </head> 
    <body> 
     Hi there - I'm {{ name }}, and I {{ verb }} programming! 
    </body> 
</html> 

A pesar del mensaje de error, tengo una carpeta llamada "plantillas" y, dentro de ella, se creó el archivo index.html:

enter image description here

enter image description here

enter image description here

I también tengo instalado jinja2.

¿Alguien tiene alguna idea de la causa de este error ahora?

Respuesta

5

Probablemente deberías estar utilizando la versión jinja2 incluida en webapp2_extras.

El ejemplo de conseguir esta configuración está aquí: http://webapp-improved.appspot.com/api/webapp2_extras/jinja2.html#webapp2_extras.jinja2.Jinja2

La diferencia clave es que en lugar de la creación de la jinja2.Environment a sí mismo, lo haces ...

from webapp2_extras import jinja2 
jinja = jinja2.get_jinja2(app=self.app) 
jinja.render_template("index.html") 

También es probable necesidad de jinja2 incluir en su sección de librariesapp.yaml:

libraries:                  
- name: jinja2                 
    version: "2.6" 
+0

Hola, @jgeewax, incluí "- name: jinja2 version: 2.6" en mi sección de bibliotecas (de hecho, ya estaba allí, me equivoqué al pegarlo en esta pregunta). Estudiaré el número de la versión de jinja2 leyendo el enlace que señalaste. – craftApprentice

2

hombre .. Estaba enfrentando el mismo problema que tú y acabo de encontrar la respuesta.

jinja_environment = jinja2.Environment(autoescape=True, 
    loader=jinja2.FileSystemLoader(os.path.join(os.path.dirname(__file__), 'templates'))) 

class MainPage(webapp2.RequestHandler): 
    def get(self): 
     template_values = { 
      'name': 'Serendipo', 
      'verb': 'extremely happy' 
     } 

     template = jinja_environment.get_template('index.html') 
     self.response.out.write(template.render(template_values)) 

El "jinja_environment" parte no necesita el extra [,] 'plantillas'. Esto se debe colocar antes de la cadena de archivo index.html como:

template = jinja_environment.get_template('templates/index.html') 

Al menos esta es la forma en que trabajó para mí (oh, y yo no estaba usando el autoescape = True parte tampoco, pero yo supongo que es opcional)

Pensando de nuevo, tal vez incluso podría dejar la parte [, 'templates'], pero tendría que poner un "/" antes de 'index.html', haciendo '/index.html', pero esto es otra suposición

+0

el '' autoescape = True'' fue el correcto para el curso de udacitity en desarrollo web que introduce plantillas – itmatters

2

Después de usar la configuración de webapp2_extras descrita en [1] y aquí, todavía tenía este error. Intenté registrar.info (jinja2.default_config). Esto mostró que el directorio predeterminado no documentado para plantillas es app-yaml-dir/templates/('template_path': 'templates'). He intentado todo menos eso. Puede restablecerlo o dejarlo tal como está, una vez que lo sepa.

jinja2.default_config['template_path'] = "html" 

Si prefiere poner plantillas en varios directorios, sólo puede configurarse para vaciar y utilizar la ruta completa al representar render_response('module/home.html', **context)

jinja2.default_config['template_path'] = "" 
  1. http://webapp-improved.appspot.com/api/webapp2_extras/jinja2.html#webapp2_extras.jinja2.Jinja2
0

jinja_environment = jinja2.Environment(autoescape=True, loader=jinja2.FileSystemLoader(os.path.join(os.path.dirname(__file__), 'templates'))) En realidad, el línea en su código significa que usted dirige su solicitud a la carpeta de plantillas pero parece que no has almacenado tu "index.html" en la carpeta de plantillas, así que simplemente elimina la redirección o transfiere tu archivo de índice a la carpeta de plantillas.