301 Перенаправление старого URL на новый с помощью Flask - PullRequest
0 голосов
/ 06 ноября 2018

Я недавно изменил формат своих URL, чтобы улучшить читаемость и SEO. Однако это сломает мои текущие URL. Поэтому я хочу перенаправить их в колбу.

Мой вопрос похож на этот здесь: Перенаправление старого URL на новый с помощью микро-фреймворка Flask

Однако, предоставленный ответ дал это:

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'

Edit:

Полная ошибка трассировки:

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'

Ответы [ 2 ]

0 голосов
/ 14 апреля 2019

Итак, похоже, эта проблема,

  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)
0 голосов
/ 06 ноября 2018

как писал Клаус выше, просто добавьте @route decorator к своим методам, например:

@app.route('/article/old-url', methods=['GET'])
def redirect_url():
    return redirect(redirect_urls[request.url], 301)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...