在Flask中重定向到URL

我是Python和Flask的新手,我正在尝试做c#中等价的Response.redirect -即:重定向到特定的URL -我如何做到这一点?

这是我的代码:

import os
from flask import Flask


app = Flask(__name__)


@app.route('/')
def hello():
return 'Hello World!'


if __name__ == '__main__':
# Bind to PORT if defined, otherwise default to 5000.
port = int(os.environ.get('PORT', 5000))
app.run(host='0.0.0.0', port=port)
616750 次浏览

Flask API文档 (v. 2.0.x):

瓶。__abc3 (__abc0, __abc1, __abc2)

返回一个响应对象(一个WSGI应用程序),如果调用该对象,则将客户端重定向到目标位置。支持的代码为301、302、303、305、307。不支持300,因为它不是一个真正的重定向,而304,因为它是一个带有定义If-Modified-Since头的请求的答案。

0.6新版功能:位置现在可以是一个unicode字符串 使用iri_to_uri()函数编码

参数:

  • location -响应应该重定向到的位置。
  • code -重定向状态码。默认为302。
  • Response (class) -在实例化响应时使用的响应类。如果未指定,默认为werkzeg .wrapper . response。
flask.redirect(location, code=302)

文档可以在在这里中找到。

你必须返回一个重定向:

import os
from flask import Flask,redirect


app = Flask(__name__)


@app.route('/')
def hello():
return redirect("http://www.example.com", code=302)


if __name__ == '__main__':
# Bind to PORT if defined, otherwise default to 5000.
port = int(os.environ.get('PORT', 5000))
app.run(host='0.0.0.0', port=port)

code的默认值是302,因此code=302可以省略或由其他重定向代码(301、302、303、305和307中的一个)替换。

#!/usr/bin/env python
# -*- coding: utf-8 -*-


import os
from flask import Flask, redirect, url_for


app = Flask(__name__)


@app.route('/')
def hello():
return redirect(url_for('foo'))


@app.route('/foo')
def foo():
return 'Hello Foo!'


if __name__ == '__main__':
# Bind to PORT if defined, otherwise default to 5000.
port = int(os.environ.get('PORT', 5000))
app.run(host='0.0.0.0', port=port)

看一下文档中的示例

我认为这个问题值得更新。只要和其他方法比较一下。

以下是如何在Flask(0.12.2)中从一个url重定向到另一个url:

#!/usr/bin/env python


from flask import Flask, redirect


app = Flask(__name__)


@app.route("/")
def index():
return redirect('/you_were_redirected')


@app.route("/you_were_redirected")
def redirected():
return "You were redirected. Congrats :)!"


if __name__ == "__main__":
app.run(host="0.0.0.0",port=8000,debug=True)

对于其他官方引用,在这里

为此,你可以简单地使用flask中包含的redirect函数

from flask import Flask, redirect


app = Flask(__name__)


@app.route('/')
def hello():
return redirect("https://www.exampleURL.com", code = 302)


if __name__ == "__main__":
app.run()

另一个有用的技巧(因为你是flask的新手)是在初始化flask对象后添加app.debug = True,因为调试器输出在找出错误时很有帮助。

Flask包含redirect函数用于重定向到任何url。此外,你可以用abort的错误代码提前终止一个请求:

from flask import abort, Flask, redirect, url_for


app = Flask(__name__)


@app.route('/')
def hello():
return redirect(url_for('hello'))


@app.route('/hello'):
def world:
abort(401)

默认情况下,每个错误代码都会显示一个黑白错误页面。

redirect方法默认接受代码302。http状态代码在这里的列表。

你可以这样用:

import os
from flask import Flask


app = Flask(__name__)


@app.route('/')
def hello():
# Redirect from here, replace your custom site url "www.google.com"
return redirect("https://www.google.com", code=200)


if __name__ == '__main__':
# Bind to PORT if defined, otherwise default to 5000.
port = int(os.environ.get('PORT', 5000))
app.run(host='0.0.0.0', port=port)

这是该代码的引用链接

这很容易,如果你只是想重定向到一个url没有任何状态码或类似的东西,你可以简单地说

from flask import Flask, redirect


app = Flask(__name__)


@app.route('/')
def redirect_to_link():
# return redirect method, NOTE: replace google.com with the link u want
return redirect('https://google.com')

这里是到Flask Docs的链接以获得更多解释

如何重定向用户/请求在Flask

在API处理程序函数中抛出错误将把用户重定向到可以处理重定向的错误处理程序。或者你也可以像其他人说的那样调用redirect,但这是重定向未授权用户的另一种方式。为了说明我的意思,我在下面提供了一个示例。

在用户应获授权的情况下

首先让我们假设你有一条被保护的路由,你像这样保护它。

def handle_api_auth(func):
"""
**handle_api_auth**
wrapper to handle public api calls authentications


:param func: a function to be wrapped
:return: wrapped function
"""


@functools.wraps(func)
def auth_wrapper(*args, **kwargs):
api_key: Optional[str] = request.headers.get('x-api-key')
secret_token: Optional[str] = request.headers.get('x-secret-token')
domain: Optional[str] = request.base_url
if is_request_valid(api_key=api_key, secret=secret_token, domain=domain):
return func(*args, **kwargs)
# NOTE: throwing an Error Here will redirect your user to an error handler or alteratively you can just call redirect like everyone else is saying, but this is another way of redirecting unathorized users
message: str = "request not authorized"
raise UnAuthenticatedError(status=error_codes.un_auth_error_code, description=message)


return auth_wrapper

is_request_valid的定义如下

@app_cache.cache.memoize(timeout=15 * 60, cache_none=False)  # timeout equals fifteen minutes // 900 seconds
def is_request_valid(api_key: str, secret: str, domain: str) -> bool:
"""
**is_api_key_valid**
validates api keys on behalf of client api calls


:param api_key: str -> api_key to check
:param secret: str -> secret token
:param domain: str -> domain registered for the api_key and secret_token
:return: bool -> True if api_key is valid
"""


organization_id: str = config_instance.ORGANIZATION_ID
# NOTE: lets assumy api_keys_view.get_api_key will return the api keys from some database somewhere
response = api_keys_view.get_api_key(api_key=api_key, organization_id=organization_id)


response_data, status_code = response
response_dict = response_data.get_json()


if not response_dict.get('status'):
return False


api_instance: dict = response_dict.get('payload')
if not isinstance(api_instance, dict):
return False


domain: str = domain.lower().strip()
# NOTE accessing the keys this way will throw ValueError if keys are not available which is what we want
# Any Error which gets thrown Ridirects the Users from the path the user is on to an error handler.
is_secret_valid: bool = hmac.compare_digest(api_instance['secret_token'], secret)
is_domain_valid: bool = hmac.compare_digest(api_instance['domain'], domain)
_request_valid: bool = is_secret_valid and is_domain_valid


return not not api_instance.get('is_active') if _request_valid else False


像这样定义错误处理程序

from flask import Blueprint, jsonify, request, redirect
from werkzeug.exceptions Unauthorized


error_handler = BluePrint('error_handlers', __name__)


@error_handler.app_errorhandler(Unauthorized)
def handle_error(e : Unauthorized) -> tuple:
"""default unath handler"""
return jsonify(dict(message=e.description)), e.code if request.headers.get('content-type') == 'application/json' else redirect('/login')

以同样的方式处理其他错误,并注意万一请求是

不是json,用户被重定向到登录页面 如果json用户得到一个unathecated的响应,那么它 直到前端处理Unath错误..

在Flask中有两种方法可以重定向到URL。

  1. 例如,您希望在用户登录后将其重定向到另一个路由,等等。
  2. 你可能还想将用户重定向到一个期望一些变量的路由: @app.route('/post/<string:post_id>')

好吧,实现flask重定向案例# 1,它很简单,只需做:

from flask import Flask,redirect,render_template,url_for
app = Flask(__name__)




@app.route('/login')
def login():
# if user credentials are valid, redirect to user dashboard
if login == True:
return redirect(url_for(app.dashboard))
else:
print("Login failed !, invalid credentials")
return render_template('login.html',title="Home Page")




@app.route('/dashboard')
def dashboard():
return render_template('dashboard.html',title="Dashboard")

要实现案例#2的flask重定向,请执行以下操作

from flask import Flask,redirect,render_template,url_for
app = Flask(__name__)




@app.route('/home')
def home():
# do some logic, example get post id
if my_post_id:
# **Note:** post_id is the variable name in the open_post route
# We need to pass it as **post_id=my_post_id**
return redirect(url_for(app.open_post,post_id=my_post_id))
else:
print("Post you are looking for does not exist")
return render_template('index.html',title="Home Page")




@app.route('/post/<string:post_id>')
def open_post():
return render_template('readPost.html',title="Read Post")

同样的事情也可以在视图中完成

<a href="\{\{url_for(app.open_post,post_id=my_post_id)}}"></a>
请注意:重定向时总是使用app.homeapp.something..(路由或视图函数名)而不是使用redirect("/home")。 原因是,如果由于某种原因将路由示例从"/home"修改为"/index/page",那么代码将中断