使用相对路径

时间:2017-09-14 20:01:11

标签: pyramid chameleon

我是金字塔的新手。当尝试使用变色龙作为模板引擎时,它在使用相对路径指定时无法找到模板 - 它正在env35/lib/python3.5/site-packages/pyramid/查找,其中env35是我创建的虚拟环境。但是,如果指定了完整路径,它将起作用。它也可以使用jinja2作为模板引擎使用相对路径。 为什么我不能使用相对路径使用变色龙模板?

来自手册

  

add_view(....,renderer,...)

     

这是单个字符串术语(例如json)或暗示路径或资产规范的字符串(例如templates / views.pt)   命名渲染器实现。如果渲染器值没有   包含一个点。,指定的字符串将用于查找a   渲染器实现,将使用该渲染器实现   从视图返回值构造响应。如果是渲染器   value包含一个点(。),指定的术语将被视为一个   path,以及路径中最后一个元素的文件扩展名   用于查找将传递的渲染器实现   完整的道路。渲染器实现将用于构造   来自视图返回值的响应。

     

请注意,如果视图本身返回响应(请参阅查看可调用响应),则永远不会调用指定的渲染器实现。

     

当渲染器是路径时,虽然路径通常只是一个简单的相对路径名(例如templates / foo.pt,暗示一个   名为“foo.pt”的模板位于相对于“templates”目录中   在Configurator的当前包的目录下,路径可以   绝对的,从UNIX上的斜杠或驱动器号前缀开始   视窗。该路径可以替代地是表单中的资产规范   some.dotted.package_name:relative / path,可以解决问题   模板资产位于单独的包中。

     

renderer属性是可选的。如果未定义,则假定为“null”渲染器(不执行渲染,值为   传回上游金字塔机械未经修改。)

以下是我设置环境的步骤......

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()

hello.pt:

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

hello.jinja2:

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

1 个答案:

答案 0 :(得分:0)

如果您指定renderer=__name__ + ':templates/hello.pt',它将起作用。解析逻辑在这种情况下不起作用,因为文件没有作为python包执行,因此可能会出现一些奇怪的东西。 pyramid_chameleon可能会在这里获得更好的支持更新,但到目前为止,真正的应用程序的常见情况是将您的代码编写为一个可以按预期工作的包。

如果您通过python -m test_app稍微调整脚本作为模块运行,它也可能有用。