金字塔:从列表中生成json视图

时间:2016-06-23 11:18:30

标签: json python-3.x pyramid

如何使用Pyramid从字符串列表生成json个视图?

通过以下尝试,仅生成列表的最后一个元素的视图;在这种情况下,jkl_json,其他人产生404 Not Found

names = ['abc', 'def', 'ghi', 'jkl']
for nm in names:
    @view_config(route_name='{}_json'.format(nm),
                 renderer='json',)
    def names_json(request):
        nm_cls = globals()[nm.title()]
        ...

这确实适用于html视图;但不是json的观点。

2 个答案:

答案 0 :(得分:3)

我建议使用Configurator.add_view方法以编程方式添加视图:

def json_view(request):
    ...

names = ['abc', 'def', 'ghi', 'jkl']
for nm in names:
    config.add_view(json_view, route_name='{}_json'.format(nm),
                 renderer='json',)

你在循环中使用装饰器的方法即使用html我也不太可能工作......我认为......

答案 1 :(得分:3)

这是因为Pyramid使用Venusian库进行装饰;它们将信息附加到函数而不是立即注册视图。此信息稍后由config.scan处理,然后才会实际注册该路由。在您的代码中,您在每个循环中使用相同的名称将<{1}}函数替换为另一个函数。由于只有最后一个在模块中可见,并且只附加了最后names_json个数据,因此这是Venusian在扫描时选择的内容。

您应该将装饰器应用于一个函数。如果你还记得那个

view_config

只是

的语法糖
 @view_config(route_name='foo')
 def bar(request):
     return Response()

你可以做到

 def bar(request):
     return Response()

 bar = view_config(route_name='foo')

另一方面,如果路径是这样的,也许你可以只使用一条路线:

def names_json(request):
    ...

names = ['abc', 'def', 'ghi', 'jkl']
for nm in names:
    names_json = view_config(route_name='{}_json'.format(nm),
             renderer='json')(names_json)

其中路线与config.add_route('names', '/foo/{name:abc|def|ghi|jkl}.json') /foo/abc.json/foo/def.json/foo/ghi.json中的任何一个匹配,并且该视图中的名称将显示为/foo/jkl.json