如何使用最短的URL路由单个web2py应用程序而不丢失管理应用程序

2024-09-30 00:25:20 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个web2py网站,有两个应用程序:标准管理应用程序和自定义的“myapp”应用程序。为了便于讨论,我们会说该网站位于sub.projdomain.com网站'. 我已经花了好几个小时想弄清楚路由和python正则表达式,但是我似乎无法实现我想要的功能。我试图复制以下行为:

URL in address bar               Effective URL
------------------               -------------
sub.projdomain.com               sub.projdomain.com/myapp/default/index
sub.projdomain.com/              sub.projdomain.com/myapp/default/index
sub.projdomain.com/foo           sub.projdomain.com/myapp/foo/index
sub.projdomain.com/foo?p=1       sub.projdomain.com/myapp/foo/index?p=1
sub.projdomain.com/foo/?p=2      sub.projdomain.com/myapp/foo/index?p=2
sub.projdomain.com/foo/bar?p=3   sub.projdomain.com/myapp/foo/bar?p=3
sub.projdomain.com/foo/bar/?p=4  sub.projdomain.com/myapp/foo/bar?p=4
sub.projdomain.com/a             sub.projdomain.com/admin/default/site

我在从页面调用URL('login')或URL('/login')时似乎总是遇到问题。”sub.projdomain.com/foo/bar/“并获取表单的错误URL”sub.projdomain.com/foo/login/或者类似的东西。目前我正在设置“routes”和“routes”元组,因为我无法让它与“routes”一起工作。我觉得我忽略了一系列简单的路线。我是不是想得太多了?在

----更新----

好吧,我想我已经找到了一套方法来获得我想要的行为,但是我真的很想知道这是否是实现它的正确方法。在

^{pr2}$

这个设置要求我仔细构造传递给URL(..)的参数。我希望它能更容易地预测URL(..)产生的结果,但我怀疑它是否比这简单。。。感谢任何帮助!在


Tags: 方法com应用程序defaulturl标准indexfoo
2条回答

您应该能够使用parameter-based rewrite system获得大致相同的结果:

routers = dict(
    BASE=dict(
        default_application='myapp',
        default_controller='default',
        default_function='index',
        functions=dict(
            default=['list', 'of', 'functions', 'in', 'default.py'],
            foo=['list', 'of', 'functions', 'in', 'foo.py']
        )
    ),
    admin=dict(
        default_function='site',
        functions=['list', 'of', 'functions', 'in', 'default.py']
    )
)

唯一的区别是“admin”应用程序仍需要URL中的“admin”(尽管我想您可以尝试通过将文件夹重命名为“a”来更改应用程序本身的名称)。在

注意,如果您想删除“index”(在admin中是“site”),则只需要在控制器中列出functions,当URL附加了额外的参数时(路由器需要能够区分URL参数和控制器函数)。在

好吧,我想我明白了。我还没有遇到过URL()无法生成正确字符串的情况。我认为这可以进一步简化,但这里是:

routes_in = (
    #Map the default index to '/'
    ('/', '/myapp/default/index'),
    #Allow the admin application to be accessed
    ('/a', '/a/default/index'),
    ('/a/$anything', '/a/$anything'),
    #Re-wire actions as controllers unless the controller is also specified
    ('/$controller', '/myapp/$controller/index'),
    ('/$controller/', '/myapp/$controller/index'),
    ('/$controller/$action', '/myapp/$controller/$action'),
    #Map static access to our application
    ('/static/$anything', '/myapp/static/$anything'),
)
#Reverse only some of the mappings so that URL() works correctly
routes_out = (
    ('/myapp/default/index', '/'),
    ('/a/$anything', '/a/$anything'),
    ('/myapp/$controller/index', '/$controller'),
    ('/myapp/$controller/$action', '/$controller/$action'),
    ('/myapp/static/$anything', '/static/$anything'),
)

我将“admin”应用程序重命名为“a”。每当我调用URL()时,我必须显式传递2个参数。第一个参数始终是控制器的名称,第二个参数始终是紧随任何GET请求变量的操作名称。E、 g.URL('default', 'index')用于主索引页,URL('foo', 'bar?param=3')用于foo中的操作bar,并指定了param。但是,不允许使用URL('foo', '?indexParam=test'),因为在第二个参数中的变量之前没有指定index。只要我遵守这些规则,一切似乎都能始终如一地工作。在

我愿意接受任何其他建议,但这是我接受的答案。我希望这能帮助其他人度过同样的困境。在

相关问题 更多 >

    热门问题