重定向到 Flask 中的 URL

问题描述 投票:0回答:11

我正在尝试执行与 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)
python redirect flask
11个回答
534
投票

您必须返回重定向:

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)

请参阅 flask 文档上的文档。 代码的默认值为 302,因此

code=302
可以省略或替换为其他重定向代码(301、302、303、305 和 307 中的一个)。


138
投票
#!/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)

查看文档中的示例


48
投票

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

烧瓶。重定向(

location
,
code=302
,
Response=None
)

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

0.6 版本中的新增功能:位置现在可以是 unicode 字符串,即 使用 iri_to_uri() 函数进行编码。

参数:

  • location
    – 响应应重定向到的位置。
  • code
    – 重定向状态代码。默认为 302。
  • Response
    (类) – 实例化响应时使用的响应类。如果未指定,则默认为 werkzeug.wrappers.Response。

23
投票

我认为这个问题值得更新,只需与其他方法进行比较即可。

以下是如何在 Flask (0.12.2) 中从一个 URL 重定向 (3xx) 到另一个 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!"

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

官方文档这里


10
投票
flask.redirect(location, code=302)

可以在此处找到文档。


10
投票

Flask 包含用于重定向到任何 url 的

redirect
函数。此外,您可以使用错误代码提前中止请求
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状态代码列表here


9
投票

如果你只想重定向到一个没有任何状态代码或类似内容的网址,你可以简单地说

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 文档的链接以获取更多说明


5
投票

为此,您可以简单地使用

redirect
 中包含的 
flask

函数
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
,因为调试器输出在找出问题所在时有很大帮助。


5
投票

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

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

嗯,要为案例 #1 实现 Flask 重定向,很简单,只需执行以下操作:

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.home
app.something..
(路由或视图函数名称)而不是使用
redirect("/home")
。 原因是,如果您出于某种原因将路线示例从
"/home"
修改为
"/index/page"
,那么您的代码将会崩溃


2
投票

你可以这样使用:

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)

这是此代码的引用链接。


-1
投票

如何在 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 向用户发送了未加引号的响应,则其 直到前端处理 Unath 错误..

© www.soinside.com 2019 - 2024. All rights reserved.