Flask 针对数据库URL的自定义重定向检查

Flask 针对数据库URL的自定义重定向检查,flask,werkzeug,Flask,Werkzeug,我正在使用Flask,Werkzeug服务于一个应用程序(一个博客)。 在这个博客中,编辑可以更改URL的slug。嗯,没关系,但我需要一种方法将旧URL重定向到新URL。 例子: /2012年里约音乐/摇滚乐 哦,不,那是2013年。让我们改变一下: /2013年里约音乐/摇滚乐 很好,现在上面的请求正在使用rock-in-rio-2013 slug执行查询 但这对我来说很重要,URL不会中断。 我认为这可以通过在引发任何异常之前捕获请求的URL来实现(例如,如果模型发出“获取记录或404”,

我正在使用Flask,Werkzeug服务于一个应用程序(一个博客)。 在这个博客中,编辑可以更改URL的slug。嗯,没关系,但我需要一种方法将旧URL重定向到新URL。 例子: /2012年里约音乐/摇滚乐 哦,不,那是2013年。让我们改变一下: /2013年里约音乐/摇滚乐

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

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

我的模型重定向将存储以下字段:

old_url = string
new_url = string
created_at = datetime

我怎样才能找到那个网址?我想要一个通用的方法(werkzeug规则)。这意味着在evey view中添加调用函数的成本太高,而且似乎是多余的。

在您的
Post
模型(您有slug)中,您可以重新定义
。首先\u或\u 404
。获取\u或\u 404
方法来处理此问题,并相应提高。但我建议定义一种新的方法,在这种情况下使用

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

问题是如何管理重定向

您可以将
重定向
实例传递给
中止
调用

与以下伪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 ...))