GAE шаблоны не работают - PullRequest
0 голосов
/ 18 марта 2012

У меня есть следующий код в моем урегулировании.py:

TEMPLATE_DIRS = (
    os.path.join(os.path.dirname(__file__),'html').replace("\\","/"),
)

и в обработчике запросов:

r = template.render('mt.html', {'some_content':blabla,})

Я ожидаю, что шаблон будет загружен из файла /project_dir/html/mt.html. Но происходит сбой со следующей ошибкой:

Traceback (most recent call last):
File "C:\Program Files (x86)\Google\google_appengine\google\appengine\ext\webapp\_webapp25.py", line 701, in __call__
handler.get(*groups)
File "D:\ap\pz4\pz4\main.py", line 33, in get
x8= template.render(fn, {'some_content':blabla,})
File "C:\Program Files (x86)\Google\google_appengine\google\appengine\ext\webapp\template.py", line 91, in render
t = _load_user_django(template_path, debug)
File "C:\Program Files (x86)\Google\google_appengine\google\appengine\ext\webapp\template.py", line 113, in _load_user_django
template = django.template.loader.get_template(file_name)
File "C:\Program Files (x86)\Google\google_appengine\lib\django_1_3\django\template\loader.py", line 157, in get_template
template, origin = find_template(template_name)
File "C:\Program Files (x86)\Google\google_appengine\lib\django_1_3\django\template\loader.py", line 138, in find_template
raise TemplateDoesNotExist(name)
TemplateDoesNotExist: mt.html

В то же время он работает нормально, когда я вызываю его, используя прямое определение папки:

r = template.render(os.path.join(os.path.dirname(__file__),'html/mt.html').replace("\\","/"),{'some_content':blabla,})

GAE - это 1.6.3 (локально), версия django (с использованием use_library ('django', 'xxx')) проверена с 0.96, 1.2 и 1.3, результат тот же.

Что я делаю не так?

Ответы [ 4 ]

1 голос
/ 18 марта 2012

Итак, проблема в движке веб-приложения: метод " _load_user_django " (из C: \ Program Files (x86) \ Google \ google_appengine \ google \ appengine \ ext \ webapp в моей системе) переопределяет пользовательская переменная TEMPLATE_DIRS:

def _load_user_django(path, debug):
  """Load the given template using the django found in third_party."""
  abspath = os.path.abspath(path)

  if not debug:
    template = template_cache.get(abspath, None)
  else:
    template = None

  if not template:
    directory, file_name = os.path.split(abspath)
    new_settings = {
        'TEMPLATE_DIRS': (directory,),
        'TEMPLATE_DEBUG': debug,
        'DEBUG': debug,
        }

    old_settings = _swap_settings(new_settings)
    ...

в результате, когда метод get_template_sources (из filesystem.py) пытается вызвать «safe_join (template_dir, template_name)», происходит сбой со следующей ошибкой:

Traceback (most recent call last):
  File "C:\Program Files (x86)\Google\google_appengine\google\appengine\ext\admin\__init__.py", line 317, in post
    exec(compiled_code, globals())
  File "<string>", line 3, in <module>
  File "C:\Program Files (x86)\Google\google_appengine\lib\django_1_3\django\utils\_os.py", line 46, in safe_join
    'path component (%s)' % (final_path, base_path))
ValueError: The joined path (x:\app_path\html\mt.html) is located outside of the base path component (x:\app_path\html\sub_templ_folder)
0 голосов
/ 19 сентября 2014

Проверьте, нет ли следующей строки в вашем файле yaml

- url: /templates
  static_dir: templates

Если вы удалите эти две строки, ваш код будет работать нормально, если ваш путь следующий:

path = os.path.join(os.path.dirname(__file__), 'templates/home.html')
0 голосов
/ 18 марта 2012

В наличии GAE, средство Django TEMPLATE_DIRS не используется. Я делаю следующее, что в основном прямо из шаблонов документов :

path = os.path.join(os.path.dirname(__file__), 'index.html')
self.response.out.write(template.render(path, template_values))

Где, в данном случае, index.html - это ресурс, который находится в корне приложения. Если ваши шаблоны находятся в каталоге в приложении, настройте os.path.join() соответственно.

0 голосов
/ 18 марта 2012

по умолчанию django ищет шаблоны в app_name / templates / app_name / template.html (да, app_name повторяется)

, поэтому в вашем случае он будет искать шаблон в project_dir / html/project_dir/template.html при условии, что project_dir совпадает с именем вашего приложения django.

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