0

我正在使用 Flask,Werkzeug 来提供应用程序(博客)。在此博客中,编辑器可以更改 URL 的 slug。好吧,没关系,但我需要一种将旧 URL 重定向到新 URL 的方法。示例:/music/rock-in-rio-2012 哦不,那是 2013 年。让我们更改:/music/rock-in-rio-2013

很好,现在上面的请求正在使用 rock-in-rio-2013 slug 执行查询。

但对我来说重要的是 URL 不会中断。我认为这可以通过在引发任何异常之前捕获请求的 URL 来完成(例如,如果模型发出“获取记录或 404”,则为 404)。

我的模型重定向将存储这些字段:

old_url = string
new_url = string
created_at = datetime

我怎样才能抓住那个网址?我想要一个通用的方式(werkzeug 规则)。这意味着在evey视图中添加调用功能成本太高而且似乎是多余的。

4

1 回答 1

2

在你的Post模型中(你有蛞蝓),你可以重新定义.first_or_404or.get_or_404方法来处理这个并相应地上升。但我建议定义一种新方法以在这些情况下使用。

这是一个干净的解决方案。逻辑在正确的地方(知道信息是什么的地方)。

问题是如何管理重定向。

您可以将redirect实例传递给abort调用。

就像下面的伪 python 代码一样:

class Post(db.Model):
  def get_or_redirect_or_404(self, slug):
    r = self.query.filter_by(new_url, old_url)
    if not r:
      # there's no model. abort normally
      abort(404)
    elseif r.old_url == slug:
      # old url used, we need redirect
      # 
      abort(redirect(... r.new_url ...))
于 2013-09-18T08:28:15.740 回答