python - Pyramid :路由模式和约束

标签 python python-2.7 pyramid

我已经完成研究并进行了一些模式匹配试验,但我仍然不知道如何:

  1. 将部分路线设为可选。例如:

    /必需(/optional/{str}) 这里括号里的部分是可选的。

  2. 对路由应用约束,因此它必须匹配元组中的项目而不是通配符字符串。

    /view_1/{('opt_a', 'opt_b', 'opt_c' ...)} 在这种情况下,如果匹配了元组中的一个项目,如果不是 404 或 FORBIDDEN,它就会路由

我怎样才能实现这些目标?

谢谢。

最佳答案

Pyramid 不支持路由中的可选模式。另一个答案建议 *optional 但这将比您要求的匹配更多,这是一个可选的占位符,并且在路线末尾没有更多模式的选项。

config.add_route('name_with_optional', '/required/{optional}/{str}')
config.add_route('name', '/required/{str}')

现在你想对我想象的两者使用相同的 View ,因为你认为占位符是可选的。因此,只需为这两种情况注册 View :

@view_config(route_name='name_with_optional')
@view_config(route_name='name')
def my_view(request):
    optional = request.matchdict.get('optional')

如果 'name' 是匹配的路由模式,则 optional 变量将为 None

至于你的第二个问题,你可以简单地创建一个自定义谓词。这可以在路线上或 View 上(请记住,它们在 Pyramid 中是分开的)。谓词的签名在每种情况下都不同。

路由上的谓词(不太常见):

def opt_must_contain(info, request):
    opt = info['match'].get('opt')
    return opt in ('opt_a', 'opt_b', 'opt_c')

config.add_route('my_route', '/view_1/{opt}', custom_predicates=[opt_must_contain])

如果此谓词返回 False,则可以匹配具有相同模式的另一条路由(忽略该路由)。

View 上的谓词(更常见):

def opt_must_contain(context, request):
    opt = request.matchdict.get('opt')
    return opt in ('opt_a', 'opt_b', 'opt_c')

config.add_route('my_route', '/view_1/{opt}')

@view_config(route_name='my_route', custom_predicates=[opt_must_contain])
def my_view(request):
    opt = request.matchdict.get('opt')

在 View 中我们会知道 opt 是必需的选项之一。

关于python - Pyramid :路由模式和约束,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11136437/

相关文章:

Python:如何使这段代码运行得更快

python - 如何让 Kivy Accordion 在按下时折叠以及如何设置默认 Accordion 折叠设置

python - 使用 dictread 时出现空键

python-2.7 - Python 小数() |小数.InvalidOperation

python - 对 alembic.ini 使用不同的 .ini 文件

python - Pyramid 网络框架 hello world 不工作

python - 在 Windows 中使用 "make UI larger"时如何避免缩放 Pygame 窗口?

python - 当我从网络上运行 CGI 脚本时,为什么 python 找不到某些模块?

python - 在变化时显示 kivy slider 值

python - 在 Pyramid 中将表单参数传递到隐藏表单的更好方法