TemplateNotFound: index.html с Google App Engine и Jinja2

Я пытаюсь создать свое первое приложение GAE с помощью jinja2. После преодоления десятка мелких ошибок, теперь я застрял на этом:

Traceback (последний последний вызов):

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

Вот мой файл 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"

Вот мой код:

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)

Вот мой шаблон .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>

Несмотря на сообщение об ошибке, у меня есть папка с именем «шаблоны», и в ней создан файл index.html:

введите здесь описание изображения

введите описание изображения здесь

введите описание изображения здесь

Я также установил jinja2.

Кто-нибудь знает причину этой ошибки сейчас?


person craftApprentice    schedule 13.06.2012    source источник


Ответы (4)


Вероятно, вам следует использовать версию jinja2, включенную в webapp2_extras.

Пример настройки здесь: http://webapp-improved.appspot.com/api/webapp2_extras/jinja2.html#webapp2_extras.jinja2.Jinja2

Ключевое отличие состоит в том, что вместо самостоятельной настройки jinja2.Environment вы делаете...

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

Вам также, вероятно, потребуется включить jinja2 в раздел libraries документа app.yaml:

libraries:                                                                      
- name: jinja2                                                                  
  version: "2.6" 
person JJ Geewax    schedule 13.06.2012
comment
Привет, @jgeewax, я включил - name: jinja2 version: 2.6 в раздел моих библиотек (на самом деле он уже был там, я ошибся, когда вставлял его в этот вопрос). Я изучу проблему с версией jinja2, прочитав указанную вами ссылку. - person craftApprentice; 13.06.2012

Человек .. Я столкнулся с той же проблемой, что и вы, и только что нашел ответ.

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))

Часть «jinja_environment» не нуждается в дополнительных [, 'templates']. Это вы должны поместить перед строкой файла index.html, например:

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

По крайней мере, так это сработало для меня (о, и я тоже не использовал часть autoescape=True, но я думаю, что это необязательно).

Подумав еще раз, возможно, вы могли бы даже оставить часть [, 'templates'] , но вам нужно было бы поставить "/" перед 'index.html', получив '/index.html', но это еще одно предположение.

person marcelocra    schedule 01.01.2013
comment
autoescape=True как раз подходил для курса udacity по веб-разработке, знакомящего с шаблонами - person itmatters; 25.04.2017

После использования настройки webapp2_extras, описанной в [1] и здесь, у меня все еще была эта ошибка. Я попробовал logging.info(jinja2.default_config). Это показало, что недокументированный каталог по умолчанию для шаблонов — app-yaml-dir/templates/('template_path': 'templates'). Я пробовал все, кроме этого. Вы можете сбросить его или оставить как есть, как только вы это узнаете.

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

Если вы предпочитаете размещать шаблоны в разных каталогах, просто установите его пустым и используйте полный путь при рендеринге 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
person cat    schedule 07.09.2015

jinja_environment = jinja2.Environment(autoescape=True, loader=jinja2.FileSystemLoader(os.path.join(os.path.dirname(__file__), 'templates'))) На самом деле строка в вашем коде означает, что вы направляете свой запрос в папку шаблонов, но похоже, что вы не сохранили свой "index.html" в папке шаблонов, поэтому просто удалите перенаправление или перенесите файл индекса в папку шаблонов.

person Hari    schedule 02.12.2017