使用 POST 将文件上传到 Flask 应用程序时出现 308 重定向

Mar*_*vey 3 curl flask python-3.x

我正在 Flask 中构建一个小型服务器应用程序,作为我正在从事的项目的一部分。部分功能是能够上传一个小的指令文件,供其中一个关键注入器下载。每个密钥注入器都有一个对应于客户端的名称 ('''),并且文件通过 POST 请求上传到服务器。

以下清单是 Flask 代码。

@app.route('/upload/instructions/<ducky_name>/', methods = ['POST'])
def upload_Instruction(ducky_name):
    file = request.files()
    path = os.getcwd() +"/files/" + ducky_name
    with open(path, "w") as f:
        f.write(file)
        print(f)
        f.close()
        return "Success"
Run Code Online (Sandbox Code Playgroud)

我正在使用此 curl 命令上传文件。

curl -X POST -d @test http://127.0.0.1:5000/upload/instructions/test1
Run Code Online (Sandbox Code Playgroud)

然后我得到一个 308 重定向,文件没有上传。这是我第一次以这种方式将文件作为POST上传,也是我第一次使用Flask。

谢谢

Nic*_*ing 8

Flaskuse werkzeug.routing.Rule,默认启用strict_slashes,访问不带尾部斜杠的分支 URL 将重定向到附加斜杠的 URL。这会导致 308(永久重定向)响应。

如果你想支持这两种路由:

  • /upload/instructions/<ducky_name>/
  • /upload/instructions/<ducky_name>

只需使用 来设置 app.route strict_slashes=False,如下所示:

@app.route('/upload/instructions/<ducky_name>/', methods = ['POST'], 
            strict_slashes=False)
def upload_Instruction(ducky_name):
    pass
Run Code Online (Sandbox Code Playgroud)

参考: https: //werkzeug.palletsprojects.com/en/1.0.x/routing/


Ser*_*bin 5

您在 curl 请求中使用的 URL 没有像 Flask 路由中那样的尾部斜杠。在这种情况下,框架将您重定向到带有斜杠的路由(请参阅文档条目)。所以只需添加尾部斜杠:

curl -X POST -d @test http://127.0.0.1:5000/upload/instructions/test1/
Run Code Online (Sandbox Code Playgroud)

Flask 使用 308 HTTP 响应代码而不是更常见的 301 来保留重定向期间的请求方法和正文。