【问题标题】:301 redirect router for Django projectDjango项目的301重定向路由器
【发布时间】:2021-03-21 17:40:22
【问题描述】:

我有一个在 Django 中创建的网站构建工具,我想向它添加简单的用户定义的 301 重定向。

Webflow 有一个非常易于理解的 301 重定向工具。您添加一条路径(不仅仅是一条 slug),然后定义该路径应引导用户的位置。

我想为我正在处理的 Django 项目做同样的事情。我目前允许用户设置重定向 /<slug:redirect_slug>/ 的 slug,他们可以设置为转到任何 URL。但我希望他们能够添加,例如,旧博客帖子的路径'/2018/04/12/my-favorite-thing/'

在 Django 中使用什么 URL conf 可以安全地接受用户想要的任何路径?

【问题讨论】:

  • 我已经发布了一个答案,它有帮助吗?如果没有,你能说出缺少什么吗?我很乐意提供帮助;D
  • 感谢您接受答案,很高兴它有帮助!不要忘记奖励赏金,以免它消失。

标签: django django-urls


【解决方案1】:

您可以使用Path Converters将路径参数转换为适当的类型,其中还包括一个url转换器。

一个例子如下:

path('api/<path:encoded_url>/', YourView.as_view()),

根据文档:

匹配任何非空字符串,包括路径分隔符“/”。这允许您匹配完整的 URL 路径,而不是像 str 那样仅匹配 URL 路径的一部分。

在您看来,您可以像这样获取您的 URL:

encoded_url = self.kwargs.get('encoded_url')

【讨论】:

【解决方案2】:

添加一个RerouteMiddleware,它首先检查来自urls.py 的现有URL 是否可以处理请求。如果无法提供,请检查请求的路径是否来自 old -> new URLs 映射,如果找到匹配项,则将其重定向到新 URL。

试一试的示例代码。

    try:
        resolve(request.path_info)
    except Resolver404:
        # Check if the URL exists in your database/constants 
        # where you might have stored the old -> new URL mapping.
        if request.path is valid:
            new_url = # Retrieve the new URL
            return redirect(new_url)

    response = self.get_response(request)
    return response

【讨论】:

    猜你喜欢
    • 2015-04-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-12-08
    • 1970-01-01
    • 2010-11-15
    • 2011-05-12
    • 1970-01-01
    相关资源
    最近更新 更多