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

wbgh16ku  于 2023-03-23  发布在  其他
关注(0)|答案(2)|浏览(324)

我正在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"

我用curl命令上传文件。

curl -X POST -d @test http://127.0.0.1:5000/upload/instructions/test1

这是我第一次用这种方式处理以POST方式上传文件,也是我第一次使用Flask。
谢谢

lyfkaqu1

lyfkaqu11#

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

curl -X POST -d @test http://127.0.0.1:5000/upload/instructions/test1/

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

rjzwgtxy

rjzwgtxy2#

Flask使用werkzeug.routing.Rule,默认启用strict_slashes,访问没有斜杠的分支URL将重定向到附加斜杠的URL。这将导致响应308(永久重定向)。
如果您希望支持这两种路由:

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

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

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

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

相关问题