为什么我的Flask应用未配置为重定向一条路由?

时间:2019-02-14 11:47:30

标签: python redirect flask

我正在尝试在Flask中编写POST路由,但是每次测试该路由时,它都会使用301代码重定向相同的URL,但将其作为GET请求。我不想要它,因为我需要POST正文。

我不明白为什么Flask会这样做。

更令人困惑的是,在同一烧瓶应用程序中,还有另一条不重定向的路由。

我还尝试过仅将“ POST”设置为允许的方法,但是仍然将路由重定向,并且响应是不允许的405方法,这是合乎逻辑的,因为我已将GET设置为不允许的方法。但是为什么它会完全重定向并重定向到自身呢?

访问日志:

<redacted ip> - - [14/Feb/2019:11:32:39 +0000] "POST /service HTTP/1.1" 301 194 "-" "python-requests/2.21.0"
<redacted ip> - - [14/Feb/2019:11:32:43 +0000] "GET /service HTTP/1.1" 200 8 "-" "python-requests/2.21.0"

应用代码,请注意,两条分别不引路并重定向的路由:

def create_app(test_config=None):
    # create and configure the app
    app = Flask(__name__, instance_relative_config=True)

    if test_config is None:
        # load the instance config, if it exists, when not testing
        app.config.from_pyfile('config.py', silent=True)
    else:
        # load the test config if passed in
        app.config.from_mapping(test_config)

    # ensure the instance folder exists
    try:
        os.makedirs(app.instance_path)
    except OSError:
        pass

    @app.route('/path/does/not/redirect')
    def notredirected():
        url_for('static', filename='style.css')
        return render_template('template.html')

    @app.route('/service', strict_slashes=True, methods=["GET", "POST"])
    def service():
        return "Arrived!"

    return app

app = create_app()

我的预期结果是POST /service将返回200并到达!作为其输出。

编辑:如果我将路由签名更改为:@app.route('/service', strict_slashes=True, methods=["POST"]),它仍然重定向到GET请求,然后返回405,因为/ service没有GET路由。

<redacted> - - [14/Feb/2019:13:05:27 +0000] "POST /service HTTP/1.1" 301 194 "-" "python-requests/2.21.0"
<redacted> - - [14/Feb/2019:13:05:27 +0000] "GET /service HTTP/1.1" 405 178 "-" "python-requests/2.21.0"

2 个答案:

答案 0 :(得分:1)

您的service路由已配置为处理GET和POST请求,但是您的service路由不能区分传入的GET和POST请求< / strong>。默认情况下,如果您未在路线上指定受支持的方法,烧瓶将默认支持GET请求。但是,由于未对传入请求进行检查,因此service路由不知道如何处理传入请求,因为同时支持GET和POST,因此它会尝试进行重定向以进行处理请求 。像下面这样的简单条件:if flask.request.method == 'POST':可用于区分两种类型的请求。话虽如此,也许您可​​以尝试以下方法:

@app.route('/service', methods=['GET', 'POST']) 
def service():
    if request.method == "GET":
        msg = "GET Request from service route"
        return jsonify({"msg":msg})
    else: # Handle POST Request
        # get JSON payload from POST request
        req_data = request.get_json()

        # Handle data as appropriate

        msg = "POST Request from service route handled"
        return jsonify({"msg": msg})

答案 1 :(得分:0)

问题是服务器将所有非https请求重定向到了我不知道的https变体。由于这对我们来说不是问题,因此解决方案是在客户端中指定使用https。