Шаблон средства визуализации Chameleon Pyramid не может быть найден с использованием относительного пути

Я новичок в пирамиде. При попытке использовать хамелеон в качестве механизма шаблонов ему не удается найти шаблон, если он указан с относительным путем — он ищет его по адресу env35/lib/python3.5/site-packages/pyramid/, где env35 — созданная мной виртуальная среда. Однако он будет работать, если указан полный путь. Он также будет работать, используя относительный путь, используя jinja2 в качестве механизма шаблонов. Почему я не могу использовать шаблон хамелеона, используя относительный путь?

Из руководства

add_view(...., визуализатор,...)

Это либо один строковый термин (например, json), либо строка, подразумевающая путь или спецификацию ресурса (например, templates/views.pt), именующую реализацию средства визуализации. Если значение средства визуализации не содержит точки ., указанная строка будет использоваться для поиска реализации средства визуализации, и эта реализация средства визуализации будет использоваться для создания ответа из возвращаемого значения представления. Если значение средства визуализации содержит точку (.), указанный термин будет рассматриваться как путь, а расширение имени файла последнего элемента в пути будет использоваться для поиска реализации средства визуализации, которому будет передан полный путь. Реализация рендерера будет использоваться для создания ответа из возвращаемого значения представления.

Обратите внимание, что если само представление возвращает ответ (см. View Callable Responses), указанная реализация средства визуализации никогда не вызывается.

Когда средством визуализации является путь, хотя путь обычно представляет собой простое относительное имя пути (например, templates/foo.pt, подразумевая, что шаблон с именем «foo.pt» находится в каталоге «templates» относительно каталога текущего пакета Конфигуратора), путь может быть абсолютным и начинаться с косой черты в UNIX или с префикса буквы диска в Windows. В качестве альтернативы путь может быть спецификацией ресурса в форме some.dotted.package_name:relative/path, что позволяет обращаться к ресурсам шаблона, которые находятся в отдельном пакете.

Атрибут рендерера является необязательным. Если он не определен, предполагается «нулевой» модуль рендеринга (рендеринг не выполняется, и значение передается обратно вышестоящему механизму Pyramid без изменений).

Вот шаги, которые я предпринял для настройки своей среды...

export VENV=~/Documents/app_projects/pyramid_tutorial/env35
python3 -m venv $VENV
source $VENV/bin/activate  #activate the virtual environment
pip install --upgrade pip
pip install pyramid 
pip install wheel
pip install pyramid_chameleon
pip install pyramid_jinja2

Моя файловая структура:

pyramid_tutorial
    env35
        bin
        ...
    templates
        hello.jinja2
        hello.pt
    test_app.py

test_app.py:

from wsgiref.simple_server import make_server
from pyramid.config import Configurator
from pyramid.response import Response
from pyramid.view import view_config

def hello(request):
    return dict(name='Bugs Bunny')

if __name__ == '__main__':
    config = Configurator()
    config.include('pyramid_chameleon')
    config.include('pyramid_jinja2')

    #This does not work... http://localhost:6543/chameleon
    config.add_route('hello_world_1', '/chameleon')
    config.add_view(hello, route_name='hello_world_1', renderer='templates/hello.pt')
    # ValueError: Missing template asset: templates/hello.pt (/home/david/Documents/app_projects/pyramid_tutorial/env35/lib/python3.5/site-packages/pyramid/templates/hello.pt)

    #This works... http://localhost:6543/chameleon2
    config.add_route('hello_world_2', '/chameleon2')
    config.add_view(hello, route_name='hello_world_2', renderer='/home/david/Documents/app_projects/pyramid_tutorial/templates/hello.pt')

    #This works... http://localhost:6543/jinja
    config.add_route('hello_world_3', '/jinja')
    config.add_view(hello, route_name='hello_world_3', renderer='templates/hello.jinja2')

    app = config.make_wsgi_app()
    server = make_server('0.0.0.0', 6543, app)
    print ('Serving at http://127.0.0.1:6543')
    server.serve_forever()

привет.pt:

<p>Hello <strong>${name}</strong>! (Chameleon renderer)</p>

привет.jinja2:

<p>Hello <strong>{{name}}</strong>! (jinja2 renderer)</p>

person Dave    schedule 14.09.2017    source источник
comment
К вашему сведению, у нас есть файл cookie, который упрощает процесс. и может предоставить рабочий пример для сравнения. Мы также не рекомендуем использовать activate.   -  person Steve Piercy    schedule 15.09.2017


Ответы (1)


Это будет работать, если вы укажете renderer=__name__ + ':templates/hello.pt'. Логика разрешения не работает в этом случае, потому что файл не выполняется как пакет Python, и поэтому могут происходить некоторые странные вещи. pyramid_chameleon, вероятно, можно было бы обновить с лучшей поддержкой здесь, но, безусловно, распространенным случаем для реальных приложений является написание кода в виде пакета, который будет работать должным образом.

Это также может сработать, если вы немного подправите настройки, запустив свой скрипт как модуль через python -m test_app.

person Michael Merickel    schedule 14.09.2017