如何将URL作为路径参数传递给FastAPI路由?代码测试报错问题咨询
这个问题我之前也碰到过,核心原因是FastAPI默认会把路径中的/当作路由的分隔符,当你传入带多个/的完整URL时,它会把https:当成第一个路径段,后面的部分被拆成其他段,完全匹配不上你定义的/{path}路由,自然就报错了。下面给你几种可行的解决办法:
方法1:使用路径转换器捕获完整路径
FastAPI支持路径转换器,其中path转换器可以匹配任意字符(包括/),帮你把整个后续路径都捕获成一个参数。只需要修改路由定义,把{path}改成{path:path}即可:
from fastapi import FastAPI app = FastAPI() @app.post("/{path:path}") def pred_image(path: str): print("path", path) return {'path': path}
现在你再用原来的测试URL请求,FastAPI就会把https://raw.githubusercontent.com/ultralytics/yolov5/master/data/images/zidane.jpg完整作为path参数传入函数,程序就能正常运行了。
方法2:改用查询参数传递URL
如果不需要把URL放在路径里,更推荐用查询参数的方式传递,这样完全避免路径分隔符的问题,代码也更直观:
from fastapi import FastAPI app = FastAPI() @app.post("/") def pred_image(url: str): print("url", url) return {'url': url}
测试的时候请求地址改成:http://127.0.0.1:8000/?url=https://raw.githubusercontent.com/ultralytics/yolov5/master/data/images/zidane.jpg
这种方式的优势是逻辑更清晰,用户也更容易理解参数的含义,后续维护起来也更方便。
方法3:对URL进行编码(不推荐)
你也可以把URL中的/替换成URL编码后的%2F,比如请求地址改成:http://127.0.0.1:8000/https%3A%2F%2Fraw.githubusercontent.com%2Fultralytics%2Fyolov5%2Fmaster%2Fdata%2Fimages%2Fzidane.jpg
不过这种方式需要手动或者在客户端做编码处理,使用起来比较麻烦,除非有特殊需求,否则不推荐。
内容的提问来源于stack exchange,提问作者Talha Anwar

