python - Django 中的相对重定向

标签 python django http redirect

我的应用程序的 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 时,这可以正常工作。

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

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/,这不适用于更深的嵌套网址(请参阅下面的编辑)。

如何告诉 Django 重定向到与应用程序前缀相关的 URL?


编辑:错误!

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

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

最佳答案

在 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() 的“name”参数相同的字符串的 URL。

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

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

关于python - Django 中的相对重定向,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7568000/

相关文章:

json - 使用 Azure 逻辑应用将 Json 数据发布到 Facebook 时间线

python - Spark : How to split an instance into Postivie/Negative Samples according to two columns

Python CSV - 需要对按另一列中的值分组的列中的值进行求和

python - RGB循环Python

python - Django 静态内联

c# - iOS http POST 请求

python - 在 Python 3 中使用 PIL 库中的图像模块时出现属性错误

python - 通过 python django 显示路径中的图像

Python 3.4.3 json.dumps() "is not JSON serializable"从字节转换时出错

java - 为什么我无法从 java 中的 POST 请求读取正文?