файл недоступен: 'templates / test.html' с использованием шаблонов jinja2 в определенных каталогах - PullRequest
4 голосов
/ 15 февраля 2012

Простое приложение GAE выдало следующую ошибку для self.jinja2.render_template () только на одном компьютере, но не на других (как macs, так и pcs):

ERROR    2012-02-14 21:54:04,987 webapp2.py:1528] [Errno 13] file not accessible: 'templates/test.html'
Traceback (most recent call last):
  File "/Applications/GoogleAppEngineLauncher.app/Contents/Resources/GoogleAppEngine-default.bundle/Contents/Resources/google_appengine/lib/webapp2/webapp2.py", line 1511, in __call__
    rv = self.handle_exception(request, response, e)
  File "/Applications/GoogleAppEngineLauncher.app/Contents/Resources/GoogleAppEngine-default.bundle/Contents/Resources/google_appengine/lib/webapp2/webapp2.py", line 1505, in __call__
    rv = self.router.dispatch(request, response)
  File "/Applications/GoogleAppEngineLauncher.app/Contents/Resources/GoogleAppEngine-default.bundle/Contents/Resources/google_appengine/lib/webapp2/webapp2.py", line 1253, in default_dispatcher
    return route.handler_adapter(request, response)
  File "/Applications/GoogleAppEngineLauncher.app/Contents/Resources/GoogleAppEngine-default.bundle/Contents/Resources/google_appengine/lib/webapp2/webapp2.py", line 1077, in __call__
    return handler.dispatch()
  File "/Applications/GoogleAppEngineLauncher.app/Contents/Resources/GoogleAppEngine-default.bundle/Contents/Resources/google_appengine/lib/webapp2/webapp2.py", line 547, in dispatch
    return self.handle_exception(e, self.app.debug)
  File "/Applications/GoogleAppEngineLauncher.app/Contents/Resources/GoogleAppEngine-default.bundle/Contents/Resources/google_appengine/lib/webapp2/webapp2.py", line 545, in dispatch
    return method(*args, **kwargs)
  File "/Users/scott/svn/GAE_branches/sample_broken_app/handlers.py", line 21, in get
    self.render_response('test.html', **context)
  File "/Users/scott/svn/GAE_branches/sample_broken_app/handlers.py", line 14, in render_response
    rv = self.jinja2.render_template(_template, **context)
  File "/Applications/GoogleAppEngineLauncher.app/Contents/Resources/GoogleAppEngine-default.bundle/Contents/Resources/google_appengine/lib/webapp2/webapp2_extras/jinja2.py", line 158, in render_template
    return self.environment.get_template(_filename).render(**context)
  File "/Applications/GoogleAppEngineLauncher.app/Contents/Resources/GoogleAppEngine-default.bundle/Contents/Resources/google_appengine/lib/jinja2/jinja2/environment.py", line 719, in get_template
    return self._load_template(name, self.make_globals(globals))
  File "/Applications/GoogleAppEngineLauncher.app/Contents/Resources/GoogleAppEngine-default.bundle/Contents/Resources/google_appengine/lib/jinja2/jinja2/environment.py", line 693, in _load_template
    template = self.loader.load(self, name, globals)
  File "/Applications/GoogleAppEngineLauncher.app/Contents/Resources/GoogleAppEngine-default.bundle/Contents/Resources/google_appengine/lib/jinja2/jinja2/loaders.py", line 115, in load
    source, filename, uptodate = self.get_source(environment, name)
  File "/Applications/GoogleAppEngineLauncher.app/Contents/Resources/GoogleAppEngine-default.bundle/Contents/Resources/google_appengine/lib/jinja2/jinja2/loaders.py", line 165, in get_source
    f = open_if_exists(filename)
  File "/Applications/GoogleAppEngineLauncher.app/Contents/Resources/GoogleAppEngine-default.bundle/Contents/Resources/google_appengine/lib/jinja2/jinja2/utils.py", line 224, in open_if_exists
    return open(filename, mode)
  File "/Applications/GoogleAppEngineLauncher.app/Contents/Resources/GoogleAppEngine-default.bundle/Contents/Resources/google_appengine/google/appengine/tools/dev_appserver_import_hook.py", line 592, in __init__
    raise IOError(errno.EACCES, 'file not accessible', filename)
IOError: [Errno 13] file not accessible: 'templates/test.html'
ERROR    2012-02-14 21:54:04,991 wsgi.py:205] 
Traceback (most recent call last):
  File "/Applications/GoogleAppEngineLauncher.app/Contents/Resources/GoogleAppEngine-default.bundle/Contents/Resources/google_appengine/google/appengine/runtime/wsgi.py", line 193, in Handle
    result = handler(self._environ, self._StartResponse)
  File "/Applications/GoogleAppEngineLauncher.app/Contents/Resources/GoogleAppEngine-default.bundle/Contents/Resources/google_appengine/lib/webapp2/webapp2.py", line 1519, in __call__
    response = self._internal_error(e)
  File "/Applications/GoogleAppEngineLauncher.app/Contents/Resources/GoogleAppEngine-default.bundle/Contents/Resources/google_appengine/lib/webapp2/webapp2.py", line 1511, in __call__
    rv = self.handle_exception(request, response, e)
  File "/Applications/GoogleAppEngineLauncher.app/Contents/Resources/GoogleAppEngine-default.bundle/Contents/Resources/google_appengine/lib/webapp2/webapp2.py", line 1505, in __call__
    rv = self.router.dispatch(request, response)
  File "/Applications/GoogleAppEngineLauncher.app/Contents/Resources/GoogleAppEngine-default.bundle/Contents/Resources/google_appengine/lib/webapp2/webapp2.py", line 1253, in default_dispatcher
    return route.handler_adapter(request, response)
  File "/Applications/GoogleAppEngineLauncher.app/Contents/Resources/GoogleAppEngine-default.bundle/Contents/Resources/google_appengine/lib/webapp2/webapp2.py", line 1077, in __call__
    return handler.dispatch()
  File "/Applications/GoogleAppEngineLauncher.app/Contents/Resources/GoogleAppEngine-default.bundle/Contents/Resources/google_appengine/lib/webapp2/webapp2.py", line 547, in dispatch
    return self.handle_exception(e, self.app.debug)
  File "/Applications/GoogleAppEngineLauncher.app/Contents/Resources/GoogleAppEngine-default.bundle/Contents/Resources/google_appengine/lib/webapp2/webapp2.py", line 545, in dispatch
    return method(*args, **kwargs)
  File "/Users/scott/svn/GAE_branches/sample_broken_app/handlers.py", line 21, in get
    self.render_response('test.html', **context)
  File "/Users/scott/svn/GAE_branches/sample_broken_app/handlers.py", line 14, in render_response
    rv = self.jinja2.render_template(_template, **context)
  File "/Applications/GoogleAppEngineLauncher.app/Contents/Resources/GoogleAppEngine-default.bundle/Contents/Resources/google_appengine/lib/webapp2/webapp2_extras/jinja2.py", line 158, in render_template
    return self.environment.get_template(_filename).render(**context)
  File "/Applications/GoogleAppEngineLauncher.app/Contents/Resources/GoogleAppEngine-default.bundle/Contents/Resources/google_appengine/lib/jinja2/jinja2/environment.py", line 719, in get_template
    return self._load_template(name, self.make_globals(globals))
  File "/Applications/GoogleAppEngineLauncher.app/Contents/Resources/GoogleAppEngine-default.bundle/Contents/Resources/google_appengine/lib/jinja2/jinja2/environment.py", line 693, in _load_template
    template = self.loader.load(self, name, globals)
  File "/Applications/GoogleAppEngineLauncher.app/Contents/Resources/GoogleAppEngine-default.bundle/Contents/Resources/google_appengine/lib/jinja2/jinja2/loaders.py", line 115, in load
    source, filename, uptodate = self.get_source(environment, name)
  File "/Applications/GoogleAppEngineLauncher.app/Contents/Resources/GoogleAppEngine-default.bundle/Contents/Resources/google_appengine/lib/jinja2/jinja2/loaders.py", line 165, in get_source
    f = open_if_exists(filename)
  File "/Applications/GoogleAppEngineLauncher.app/Contents/Resources/GoogleAppEngine-default.bundle/Contents/Resources/google_appengine/lib/jinja2/jinja2/utils.py", line 224, in open_if_exists
    return open(filename, mode)
  File "/Applications/GoogleAppEngineLauncher.app/Contents/Resources/GoogleAppEngine-default.bundle/Contents/Resources/google_appengine/google/appengine/tools/dev_appserver_import_hook.py", line 592, in __init__
    raise IOError(errno.EACCES, 'file not accessible', filename)
IOError: [Errno 13] file not accessible: 'templates/test.html'
INFO     2012-02-14 21:54:05,006 dev_appserver.py:2884] "GET /test HTTP/1.1" 500 -

Приложение просто:

handlers.py:

import webapp2

from webapp2_extras import jinja2

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)

    def render_response(self, _template, **context):
        # Renders a template and writes the result to the response.
        rv = self.jinja2.render_template(_template, **context)
        self.response.write(rv)


class MyHandler(BaseHandler):
    def get(self):
        context = {'message': 'Hello, world!'}
        self.render_response('test.html', **context)

webapp2_config = {}
webapp2_config['webapp2_extras.sessions'] = {
    'secret_key': 'ef23fsdawe444',
}

application = webapp2.WSGIApplication([
    webapp2.Route(r'/test', handler=MyHandler, name='test'),

], debug=True, config=webapp2_config)

app.yaml:

application: sampleapp
version: 0-01
api_version: 1
runtime: python27
threadsafe: false

builtins:
- remote_api: on

handlers:
- url: .*
  script: handlers.application

libraries:
- name: jinja2
  version: 2.6

- name: webapp2
  version: 2.3

Также имеется каталог шаблонов с test.html.

Теперь, когда я запускаю приложение из другого каталога, оно работает нормально.

Этот google python group пост дал мне подсказку попробовать другой каталог, но я понятия не имею, что не так с оригиналом, который запускал версии кода без jinja2 из webapp2_extras нормально.

Информация о версии: OS X 10.6.8, GoogleAppEngineLauncher: 1.6.2, Python: 2.7.2

Я переустановил все и установил для PYTHONPATH значение "" в моем файле .bash_profile, но это ничего не изменило.

Примечание: я вычеркнул несколько непубличных имен каталогов из вывода отладки, но у них не было пробелов или чего-то еще.

У некоторых других была похожая ошибка , но их исправления были для более старых версий. Кажется, что-то есть в os.path

Ответы [ 2 ]

3 голосов
/ 21 марта 2014

корневая папка и любая папка, которую вы указали в app.yaml как статический каталог, не будет работать с jinja2 FileSystemLoader

Во время развертывания значение upload_dir будет добавлено в CDN вместо экземпляра GAE, хотя в настоящее время вы находитесь на локальном сервере разработки, App Engine SDK не позволяет загружать файлы из тех мест, которые вы не смогли найти в работе.

2 голосов
/ 23 апреля 2012

Я получаю эту ошибку, но без использования jinja2 из webapp2_extras (я сам создавал jinja_enviroment, например

jinja_environment = jinja2.Environment(loader=jinja2.FileSystemLoader(os.path.dirname(__file__)))

). Я решил это, проигнорировав os.path.dirname(__file__), что есть в документации, и просто поместив

jinja_environment = jinja2.Environment(loader=jinja2.FileSystemLoader('templates'))

Так что я думал, что смогу помочь, но попытался решить твою проблему, но ничего не пришло. Но когда ты сказал

У некоторых других была похожая ошибка, но их исправления были для старых версии. Кажется, что-то есть в os.path

что вы имели в виду? Вы используете os.path в какой-то части кода? Поскольку os.path проблематичен и webapp2_extras.jinja2 не использует его, он просто создает среду с «шаблонами», написанными от руки в качестве каталога шаблонов. Проверьте источник .

Так что, возможно, где-то есть подсказка в этом комментарии. Удачи.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...