【问题标题】:Pyramid: generate json views from listPyramid:从列表生成 json 视图
【发布时间】:2016-10-25 16:47:46
【问题描述】:

如何使用 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 视图。

【问题讨论】:

  • 你需要 @view_configadd_route 除非你使用类似 @simple_route 的东西来做路由和查看配置:websauna.org/docs/api/…

标签: python json python-3.x pyramid


【解决方案1】:

我建议使用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,您在循环中使用装饰器的方法也不太可能奏效......

【讨论】:

  • 我得到 AttributeError: AttributeError: 'function' object has no attribute 'maybe_dotted' in application\lib\site-packages\pyramid\util.py", line 519。你如何导入config
【解决方案2】:

这是因为 Pyramid 使用 Venusian 库作为装饰器;他们将信息附加到函数而不是立即注册视图。此信息稍后由config.scan 处理,然后才真正注册路由。在您的代码中,您将在每个循环上用相同名称的 another 函数替换 names_json 函数。由于模块中只有最后一个可见,并且只有最后一个 view_config 数据附加到它,这就是 Venusian 在扫描时拾取的内容。


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

 @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 中的任何一个,并且名称将在视图中以request.matchdict['name'] 的形式提供。

【讨论】:

    猜你喜欢
    • 2016-05-18
    • 2017-05-13
    • 2023-01-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-10-05
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多