如何使用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的观点。
答案 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
。