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

时间:2013-09-18 05:09:09

标签: flask werkzeug

我正在使用Flask,Werkzeug来提供应用程序(博客)。 在这篇博客中,编辑可以更改URL的slug。好吧,没关系,但我需要一种方法将旧URL重定向到新的URL。 例: /音乐/摇滚在-RIO-2012 哦不,那是2013年。让我们改变: /音乐/摇滚式-RIO-2013

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

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

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

old_url = string
new_url = string
created_at = datetime

如何捕获该网址?我想要一种通用的方式(werkzeug规则)。这意味着在evey视图中添加调用函数会花费太多而且看起来多余。

1 个答案:

答案 0 :(得分:2)

在您的Post模型中(您有slug),您可以重新定义.first_or_404.get_or_404方法来处理此问题并相应地提升。但我建议在这些情况下定义一种新方法。

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

问题是如何管理重定向。

您可以将redirect个实例传递给abort来电。

与以下伪python-code

类似
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 ...))