Django:如果 slug 错误,则重定向 url

Posted

技术标签:

【中文标题】Django:如果 slug 错误,则重定向 url【英文标题】:Django: redirect url if slug is wrong 【发布时间】:2018-01-06 09:38:34 【问题描述】:

我有一个函数可以运行每个视图来纠正蛞蝓。 例如,如果 slug 是 /12-post-about-stuff 并且用户输入 /12-post-abot_stof 他们将被正确重定向。问题是不同的视图有不同的 url 模式,例如:

/posts/post_slug/
...
/posts/post_slug/comments/new

如何编写一个函数,通过根据当前 url 修复 slug 名称来重定向?

编辑:我正在使用 board_name 和 pk 参数对每个视图应用装饰器。我不知道的是如何动态返回新的url,因为每个视图的url格式都不一样。

def correct_board_url_name(func):
  def wrapper(request, board_slug):
        try:
            pk = int(board_slug.split('-')[0])
            board = Board.objects.get(pk=pk)
            if (board.slug != board_slug):
                # This does not always work depending on what is entered
                return redirect(request.get_full_path().replace(board_slug, board.slug, 1))
            else:
                return func(request, board_slug)
        except:
            raise Http404('')
    return wrapper

【问题讨论】:

你能详细说明一下吗? 您打算如何将错误的 url 与正确的 url 匹配?它是基于PK 12的吗?您使用的是基于类还是基于函数的视图? 基于类的视图,为清晰起见进行了编辑 可能是resolve 帮助你:docs.djangoproject.com/en/1.11/ref/urlresolvers/#resolve 和它***.com/questions/2491605/… 【参考方案1】:

如果您想在许多不同的视图中处理请求,中间件是一个不错的选择。

class RedirectMiddleware(object):
    def process_request(self, request):
        if request.resolver_match.app_name == 'posts' \
                and 'post_slug' in request.resolver_match.kwargs: 
            new_path = None
            # your logic here
            if new_path:
                return redirect(new_path, permanent=True)
        return

在设置中:

MIDDLEWARE = [
    # another middlewares here ...
    'path.to.RedirectMiddleware',
]

【讨论】:

以上是关于Django:如果 slug 错误,则重定向 url的主要内容,如果未能解决你的问题,请参考以下文章

单击时,如果服务器速度慢,则重定向到另一个 URL?

如果 URL 在播放框架中无效,则重定向到错误页面。 1.25?

如果域不正确则重定向

带有更新的 slug 的 Django 通用视图 UpdateView 重定向 URL

如果 URL 与 slug 不匹配,则规范链接和 301 重定向

如果用户已登录,则重定向