Рекурсивно отображать древовидную структуру файлов с помощью шаблона Tornado - PullRequest
0 голосов
/ 27 мая 2020

Я хочу отобразить дерево файлов внутри определенной папки (РЕЗУЛЬТАТЫ) на моей html странице. Я использую python Tornado. Я использовал ответ на этот вопрос , чтобы получить большую часть пути, и модифицировал, чтобы попытаться работать с Tornado.

В приведенном ниже коде верхний каталог отображается как заголовок, и папки внутри верхнего каталога отображаются, но шаблон не oop просматривает элементы в поддеревьях.

Вот вызов рендеринга:

def get(self):
    logging.info("Loading Results tree...")
    self.render("results.html", tree=make_results_tree('RESULTS'))

Вот функция make_results_tree:

def make_results_tree(path):
    tree = dict(name=path, children=[])
    lst = os.listdir(path)
    if (path == 'RESULTS' and len(lst) == 1):
        tree['children'].append(dict(name="No results recorded for today"))
    else:
        for name in lst:
            fn = os.path.join(path, name)
            if os.path.isdir(fn):
                tree['children'].append(make_results_tree(fn))
            elif (name != '.gitkeep'):
                tree['children'].append(dict(name=name))
    return tree

Я проверил, что код python работает так, как задумано, поэтому проблема заключается в коде шаблона ниже (результаты. html), вероятно, в if или l oop block:

<div class="center">
  <h2>{{ tree['name'] }}</h2>
  <ul>
    {% for item in tree['children'] %}
      <li>{{ item['name'] }}
      {% if locals().get('item["children"]', False) %}
        <ul>{{ loop(item['children']) }}</ul>
      {% end %}</li>
    {% end %}
  </ul>
</div>

Почему код шаблона не l oop проходит через несколько уровней дерева?

1 Ответ

1 голос
/ 28 мая 2020

loop() - особенность Jinja2; в шаблонах Tornado аналогов нет. Вместо анонимной рекурсии разделите файл на два файла, чтобы внутренний файл мог вызывать себя рекурсивно.

Кроме того, locals().get() выполняет только простой поиск, он не может разрешать сложные выражения, такие как eval() can. Здесь вам не нужно locals, просто оперируйте напрямую с item.

результаты. html:

<div class="center">
  <h2>{{ tree['name'] }}</h2>
  <ul>{% module Template('items.html', children=tree['children']) %}</ul>
</div>

элементов. html:

{% for item in children %}
  <li>{{ item['name'] }}
  {% if "children" in item %}
    <ul>{% module Template('items.html', children=item['children']) %}</ul>
  {% end %}</li>
{% end %}
...