【问题标题】:301 Redirecting an old URL to a new one with Flask301 使用 Flask 将旧 URL 重定向到新 URL
【发布时间】:2018-11-06 05:54:19
【问题描述】:

我最近更改了 URL 的格式,以提高可读性和 SEO。但是,这会破坏我当前的 URL。所以我想在烧瓶中重定向它们。

我的问题与这里的问题类似: Redirecting an old URL to a new one with Flask micro-framework

但是,提供的答案给出了这个:

redirect_urls = {
    '/article/old-url': '/article/new-url/id',
    '/article/old-url-2': '/article/new-url-2/id',
    '/article/old-url-3': '/article/new-url-3/id',
    ...
}

def redirect_url():
    return redirect(redirect_urls[request.url], 301)

for url in redirect_urls:
    app.add_url_rule(url, url, redirect_url)

问题是,代码给出了 500 错误代码。

KeyError: '/article/old-url'

编辑:

完整的回溯错误:

Exception on /article/old-url [GET]
Traceback (most recent call last):
  File "/usr/local/lib/python3.4/dist-packages/flask/app.py", line 1988, in wsgi_app
    response = self.full_dispatch_request()
  File "/usr/local/lib/python3.4/dist-packages/flask/app.py", line 1641, in full_dispatch_request
    rv = self.handle_user_exception(e)
  File "/usr/local/lib/python3.4/dist-packages/flask/app.py", line 1544, in handle_user_exception
    reraise(exc_type, exc_value, tb)
  File "/usr/local/lib/python3.4/dist-packages/flask/_compat.py", line 33, in reraise
    raise value
  File "/usr/local/lib/python3.4/dist-packages/flask/app.py", line 1639, in full_dispatch_request
    rv = self.dispatch_request()
  File "/usr/local/lib/python3.4/dist-packages/flask/app.py", line 1625, in dispatch_request
    return self.view_functions[rule.endpoint](**req.view_args)
  File "/home/*****/mysite/flask_app.py", line 77, in redirect_url
    return redirect(redirect_urls[request.url], 301)
KeyError: 'https://www.example.com/article/old-url'

【问题讨论】:

  • 您只需在视图中添加另一个 route 装饰器。
  • 6 个月后仍然需要回答这个问题:/

标签: python redirect flask


【解决方案1】:

所以,看起来像这个问题,

  File "/home/*****/mysite/flask_app.py", line 77, in redirect_url
    return redirect(redirect_urls[request.url], 301)
KeyError: 'https://www.example.com/article/old-url'

是因为下面的字典造成的

redirect_urls = {
    '/article/old-url': '/article/new-url/id',
    '/article/old-url-2': '/article/new-url-2/id',
    '/article/old-url-3': '/article/new-url-3/id',
    ...
}

只有子路径。

要解决此问题,您可以采取的一种方法是

BASE_URL = 'https://www.example.com'
return redirect(redirect_urls[request.url.replace(BASE_URL, '')], 301)

这将最终执行字典redirect_urls中的以下内容。

return redirect(redirect_urls['/article/old-url'], 301)

【讨论】:

    【解决方案2】:

    正如上面 Klaus 所说,只需将 @route 装饰器添加到您的方法中,例如:

    @app.route('/article/old-url', methods=['GET'])
    def redirect_url():
        return redirect(redirect_urls[request.url], 301)
    

    【讨论】:

    • 另外,我需要一种方法来重定向多个 URL,而不仅仅是一个。
    猜你喜欢
    • 1970-01-01
    • 2021-12-27
    • 2010-11-09
    • 2011-04-16
    • 2015-03-30
    • 1970-01-01
    • 2014-11-13
    • 2017-02-27
    相关资源
    最近更新 更多