【问题标题】:Relative redirect in DjangoDjango中的相对重定向
【发布时间】:2011-11-25 22:46:48
【问题描述】:

我的应用程序的 url 配置当前如下所示:

from django.conf.urls.defaults import patterns
from django.views.generic.simple import redirect_to

urlpatterns = patterns("myapp.views",
    (r"^$", redirect_to, {"url": "main/"}),
    (r"^(?P<title>.+)/$", "article"),
    ...
)

当应用的 url 不带前缀使用时,这可以正常工作。

现在,我想将我的应用程序的 url 包含到项目的 url 配置中,并带有前缀;像这样:

urlpatterns = patterns("",
    (r"^myapp/", include("myapp.urls")),
)

然后http://myserver.org/myapp/ 不会重定向到http://myserver.org/myapp/main/,而是重定向到http://myserver.org/main/

我想我理解它是如何工作的:项目的 url 模式得到 "myapp/"。这匹配前缀,被剥离,留下"",它被传递给应用程序的模式。该应用程序与剥离无关,只是重定向到 main/Django 将其解释为 /main/,它不适用于更深的嵌套 URL(请参阅下面的编辑)。

如何告诉 Django 重定向到相对于应用前缀的 URL?


编辑:错误!

啊!上面的代码工作正常,但我的浏览器缓存了永久重定向到上一个 url,即"/main/"。我清除了我的缓存和我的新网址"main/"(现在是临时的以防止缓存)工作得很好。对不起!

但我意识到,当我想从更深的嵌套中转到相对于应用程序根目录的 url 时,答案会很有帮助:"relative/" 可能适用于 http://myserver.org/myapp/foo/,但不适用于 http://myserver.org/myapp/foo/bar/

【问题讨论】:

    标签: python django http redirect


    【解决方案1】:

    在 django 1.4 中你将能够使用函数reverse_lazy():

    from django.core.urlresolvers import reverse_lazy
    urlpatterns = patterns("myapp.views",
        (r"^$", redirect_to, {"url": reverse_lazy("myapp_title")}),
        (r"^(?P<title>.+)/$", "article", name="myapp_title"),
        ...
    )
    

    reverse_lazy() 解析为与作为参数提供给 reverse_lazy() 的“名称”参数相同的字符串的 URL。

    如果您使用的是早期版本,则必须指定完整路径,这当然违反了 DRY 原则:

    (r"^$", redirect_to, {"url": "myapp/title/"}),
    

    【讨论】:

    • 所以我只升级到开发版,因为它是一个爱好程序。你能检查我的编辑吗?我认为那里的一切都是正确的吗? ^^
    • 嗯,等一下:reverse_lazy 如何解析为/myapp/title/?如果我想重定向到例如怎么办? /myapp/main/(我想要的,我弄错了-.-)?
    • @飞羊,您需要将name 参数分配给您要重定向到的URL。例如name="myapp_main"。然后你做 reverse_lazy("myapp_main") 来获取这个 URL。我做了一些编辑以清除问题:)您可以通过这种方式从任何地方重定向到任何应用程序。
    • 啊,好吧,我想现在已经很清楚了。所以reversereverse_lazy 给我任何网址模式的绝对网址?但是他们不需要参数然后才知道匹配的 url 吗?喜欢(r"^$", redirect_to, {"url": reverse_lazy("myapp_title", args=("main",))}),
    • @flying sheep 仅当您的 URL 有参数时,例如 /users/(\d+)
    猜你喜欢
    • 2014-08-19
    • 2021-10-11
    • 2010-12-11
    • 2012-01-29
    • 1970-01-01
    • 2019-11-12
    • 2020-02-26
    相关资源
    最近更新 更多