2012-03-17 5 views
0

я следующий код в моем settins.py:GAE шаблоны не работает

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, результат тот же.

Что я делаю неправильно?

ответ

0

по умолчанию Джанго ищет шаблоны в app_name/шаблоны/app_name/template.html (да, app_name повторил)

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

+0

я поставил "mt.html" в следующих папках: app_root app_root/html app_root/html/app_name , но он по-прежнему не работает. – user1276220

+0

Документы могут помочь вам немного больше, чем я. https: //docs.djangoproject.com/en/dev/ref/templates/api/ Похоже, что я ошибаюсь, я использовал подпапки в своих шаблонах, но вы этого не делаете. Это довольно легко отлаживать, добавляя строку для печати либо шаблона_файла, либо имя_файла в соответствующих местах, указанных в трассировке стека. – dragonx

0

На складе GAE, Django's TEMPLATE_DIRS объект не используется. Я делаю следующее, которая в основном прямо из the templates docs:

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

Понятно, что это также работает для меня, но мне нужно использовать функцию «extends template», и она работает только тогда, когда все шаблоны хранятся в одной и той же (корневой) папке. Но у меня есть структура папок (2-3 уровня), и мне не нравится хранить ~ 40 шаблонов в той же папке. – user1276220

+0

@ user1276220: Мой ответ по связанному вопросу имеет метод, позволяющий использовать относительные пути в ваших вызовах 'extends' и' include': http://stackoverflow.com/questions/5263623/templatedoesnotexist-on-python-app Джанго--движка-1-2, а-шаблон-рендеринг заново –

1

Таким образом, проблема в WebAPP двигателя: метод "_load_user_django" (из C: \ Program Files (x86) \ Google \ google_appengine \ Google \ AppEngine \ вн \ веб-приложение на моей системе) переопределяет пользователь -определенной 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

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

- url: /templates 
    static_dir: templates 

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

path = os.path.join(os.path.dirname(__file__), 'templates/home.html') 
Смежные вопросы