2017-01-11 3 views
0

Os.path.sep возвращает \\Os.path.sep вопрос о Windows, при визуализации шаблона

Имея проблемы с этим путем при попытке визуализации шаблона:

#1: This doesn't work: 

path = os.path.join('file', 'name.html') 
render_template(path) 
#path is: 'file\\name.html' 
# In broswer, it shows this error: 
# jinja2.exceptions.TemplateNotFound: file\name.html 

#2: This works: 
path = os.path.join('file', 'name.html').replace('\\', '/') 
render_template(path) 
#path is: 'file/name.html' 

Если я открываю окно file explorer и copy 'file \ name.html' из местоположения скрипта, где эта строка вызывается, она работает нормально, поэтому почему # 1 не может найти шаблон, но # 2 может?

ответ

1

В соответствии с разделом Loaders в документации Jinja загрузка шаблонов из файловой системы осуществляется классом jinja2.FileSystemLoader. Существует вызов функции split_template_path(), который анализирует входящий путь и проверяет его разумность внутри этого класса (см. site-packages/jinja2/loaders.py), а проверка работоспособности выполняется путем извлечения токенов, разделенных символом косой черты, следующим образом:

def split_template_path(template): 
"""Split a path into segments and perform a sanity check. If it detects 
'..' in the path it will raise a `TemplateNotFound` error. 
""" 
pieces = [] 
for piece in template.split('/'): 
    if path.sep in piece \ 
     or (path.altsep and path.altsep in piece) or \ 
     piece == path.pardir: 
     raise TemplateNotFound(template) 
    elif piece and piece != '.': 
     pieces.append(piece) 
return pieces 
+1

Интересно, что в моем случае не является частью этого условия: «if path.sep in piece». path.sep - \\, а моя часть - файл \\ name.html. Итак, я знаю, что код будет работать в Linux, потому что путь.sep есть /. Это действительно неудобно из Flask, что это условие не проходит в Windows. – vincedjango

Смежные вопросы