【问题标题】:Optional url segment pattern in a Pyramid route金字塔路线中的可选 url 段模式
【发布时间】:2021-10-10 14:06:23
【问题描述】:

我正在尝试创建一个带有可选 url 子路径的网站:

  • /user - 返回用户的一般信息
  • /user/edit - 编辑用户

我试过设置:

config.add_route('user', '/user/{action}')

@view_defaults(route_name="user")
class UserViews():

# not sure what (if anything) to put in @view_config here...
def user_general(self):
    return Response("General User Info"

@view_config(match_param="action=edit")
def edit(self):
    return Response("Editing user")

虽然这适用于 /user/edit,但它会为 /user 返回 404

如果我使用共享路径设置 2 个显式路由,它也会以同样的方式失败 - 例如:

config.add_route('login', '/user')
config.add_route('edit_user', '/user/edit')

我尝试过设置match_params="action=",但无法正常工作。

关于如何实现这一点的任何想法?

【问题讨论】:

  • 我有一种模糊的感觉,你正在尝试重新发明 Pyramid 的“遍历”机制 (docs.pylonsproject.org/projects/pyramid/en/latest/narr/…) 如果“用户”是某种“用户资源”,它会提供所有常见的逻辑你的观点怎么办?类现在提供,并且两个视图都注册在 UserResource 的“上下文”中?
  • 查看您的代码后,我想知道您是否尝试访问/user/ - 我认为您的“user_general”视图应该在那里

标签: python pyramid


【解决方案1】:

user_general继承类的默认路由配置,需要{action}匹配参数。如果您未在请求中提供该信息,则该视图的路由将永远不会匹配,并返回 404 not found 响应。

您需要将带有route_name 参数的装饰器添加到user_general 以覆盖视图的默认路由。

@view_config(
    route_name="user"
)
def user_general(self):

以下对我来说是一个完整的示例,其中包含一些次要的显式命名约定。

from wsgiref.simple_server import make_server
from pyramid.config import Configurator
from pyramid.response import Response
from pyramid.view import view_config, view_defaults


@view_defaults(route_name="user_action")
class UserViews():
    def __init__(self, context, request):
        self.request = request
        self.context = context

    @view_config(
        route_name="user_get",
        request_method="GET"
    )
    def get_user(request):
        return Response("I got you, Babe!")

    @view_config(
        match_param="action=edit"
    )
    def edit(self):
        return Response("Don't ever change, Babe!")

if __name__ == "__main__":
    with Configurator() as config:
        config.add_route("user_get", "/user")
        config.add_route('user_action', '/user/{action}')
        config.scan()
        app = config.make_wsgi_app()
    server = make_server("0.0.0.0", 6543, app)
    server.serve_forever()

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-05-09
    • 2017-05-07
    • 2012-10-03
    • 2012-03-27
    • 1970-01-01
    • 2019-07-19
    • 2021-05-14
    • 2013-05-09
    相关资源
    最近更新 更多