使用js.fetch请求Flask接口时为何意外发送GET请求
问题根因排查
你明确配置PUT方法但实际发起GET请求,是3处代码错误共同/单独触发的,按影响优先级排序:
dict_converter参数传错位置
你代码里把dict_converter=Object.fromEntries作为js.fetch的第三个参数传入,但这个参数是Pyodide中to_js()方法的配置项,不是fetch的合法参数。这会导致to_js(request_params)执行时,默认把Python字典转换成JS的Map类型对象,而fetch API无法识别Map类型的配置对象,读取不到你设置的method: "PUT"字段,就会使用默认值GET发起请求。- 请求URL缺少协议前缀
你传入的请求地址是'127.0.0.1:5000',没有带http:///https://协议头,fetch会把该字符串识别为当前站点下的相对路径,不会请求你本地启动的Flask服务。部分运行时环境下解析非法URL时,也会静默重置请求方法为GET。 - 请求体未做JSON序列化
你直接把Python字典作为body字段传入,即使经过to_js转换,得到的也是JS普通对象,和你设置的Content-Type: application/json要求的JSON字符串格式不匹配。fetch遇到格式非法的请求体时,可能不会抛出显性报错,而是直接丢弃body、重置为无请求体的GET请求。
修正后参考代码
import json txt = "This text here" data = {"data": txt} request_params = { "method": "PUT", "body": json.dumps(data), "credentials": "same-origin", "headers": {"Content-Type": "application/json"} } resp = await js.fetch( 'http://127.0.0.1:5000/your-flask-route-path', to_js(request_params, dict_converter=Object.fromEntries) )
额外提示:如果本地Flask服务开启了CORS校验,记得提前配置Flask-CORS允许对应来源的跨域请求,否则PUT请求会被浏览器跨域策略拦截。
内容的提问来源于stack exchange,提问作者Malik Allahham
相关产品推荐
相关产品推荐

