我正在使用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视图中添加调用函数会花费太多而且看起来多余。
答案 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 ...))