【问题标题】:Hide all controller and function names from the URLs web2py从 URL web2py 中隐藏所有控制器和函数名称
【发布时间】:2014-03-03 21:50:49
【问题描述】:

Similar question, which didn't solve my problem.

我希望我的应用程序的每个页面都有唯一的字符串标识符(slugs),并且为了使 URL 更短,我试图从 URL 中隐藏控制器和函数名称。所以,而不是这个:

mysite.com/app/c/f/my-slug

我想要这个:

mysite.com/my-slug

我能得到的最好的(使用 URL 重写)是这样的:

mysite.com/f/my-slug

如果我只是将“c”设置为默认控制器,将“f”设置为默认函数并尝试访问 app/some-slug(假设“f”可以处理此类 slug),web2py 会给出“无效控制器(我的) " 错误。

由于我无法让基于模式的 URL 重写工作(可能是因为我做错了),我想我需要将每个 slug 及其默认控制器和函数名称存储在数据库中的“普遍默认”功能来处理这一切。然后,如果我需要对某个页面执行其他操作,我会将操作名称放在 URL 中的 slug 前面。

那么……可行吗?夸张的?一个糟糕的主意?

【问题讨论】:

    标签: python url model-view-controller web2py


    【解决方案1】:

    在 routes.py 中,你可以这样做:

    routers = dict(
        BASE = dict(
            default_application='myapp',
            default_controller='default',
            default_function='index',
            functions=['function1', 'function2', 'function3']))
    

    在这种情况下,/my-slug 将被路由到 /myapp/default/index/my-slug。

    如果您想将不同的 slug 映射到不同的控制器和功能,您可以通过在数据库(或其他一些存储方式)中查找 slug 并在模型文件中设置 request.controller 和 request.function 来实现,但您可能不希望对每个请求都进行额外的数据库查找。相反,您可以使用基于模式的重写系统,但您必须为每个 slug 设置模式。

    【讨论】:

    • 成功了,非常感谢。我用头撞墙了一段时间,直到我记得正确的键是“路由器”而不是“路由器”(也许你会想在你的答案中改变它)并且我应该将 myapp 的默认控制器和功能放在如果要使用具有不同控制器和/或函数名称的多个应用程序(例如管理员),则使用“myapp”键。
    • 但是,我还有一个问题:slug 将是不可预测的,所以我不能使用基于模式的系统(除非我编写一些代码来动态添加和删除它们并重新加载 routes.py )。我很确定几乎每个页面都会从数据库中加载,那么查找的影响是否仍然如此负面?例如,我是否可以进行查找,然后将 DB 条目的内容作为参数发送给函数,以避免不必要的双重查询?
    • 如果每个 slug 的内容都在 DB 中,那么只需使用上面的路由,并让 index 函数检索与 slug 关联的内容。在 index 函数中,您将能够通过 request.args(0) 访问 slug。所以,索引函数可能只是return dict(content=db.content(slug=request.args(0))。
    • 我使用了这个例子,结果很好,但注意到它只适用于我的索引页面。我有多个控制器,并希望将它们(控制器名称和功能)隐藏起来。有没有更好的办法?
    • 使用基于参数的路由系统(如上图),每个app只能隐藏一个controller,每个controller可以隐藏一个function。从逻辑上讲,这是有道理的,因为您需要某种方式将传入的 URL 路由到适当的控制器(如果给定的 URL 没有控制器并且您有两个“隐藏”控制器,路由系统如何知道要路由到哪一个?) .如果您需要更复杂的东西,则必须切换到基于模式的路由系统(即使那样,URL 也必须包含 一些 信息以指示适当的控制器和功能)。跨度>
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-05-23
    • 1970-01-01
    • 2014-08-16
    • 1970-01-01
    • 2013-09-08
    相关资源
    最近更新 更多