【问题标题】:308 redirect when using POST to upload a file to Flask application使用 POST 将文件上传到 Flask 应用程序时出现 308 重定向
【发布时间】:2020-05-22 11:59:08
【问题描述】:

作为我正在进行的项目的一部分,我正在 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

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

谢谢

【问题讨论】:

    标签: python-3.x curl flask


    【解决方案1】:

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

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

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

    【讨论】:

    • 谢谢,将request.file 更改为request.data 修复了它。谢谢
    • 而且@MartinHarvey 你应该已经接受了这个答案,或者至少除了你的“谢谢”之外,还应该支持它
    • 即使在传输超长 utf-8 字符串作为参数进行测试时,从 API 中去掉简单的尾部斜线也对我有所帮助。与客户的斜线匹配也有帮助,但我在得到 200 之前得到了 308(我认为)。有意思,没时间玩了,谢谢大家的帮助
    • 这对我有用!谢谢!
    【解决方案2】:

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

    如果你想同时支持两条路线:

    • /upload/instructions/&lt;ducky_name&gt;/
    • /upload/instructions/&lt;ducky_name&gt;

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

    @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/

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-11-29
      • 2015-09-18
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多