我有这个FastAPI应用程序
import uvicorn
from fastapi import FastAPI
from starlette.responses import FileResponse
app = FastAPI()
@app.get("/a")
async def read_index():
return FileResponse('static/index.html')
@app.get("/a/b")
def download():
return "get"
@app.post("/a/b")
def ab():
return "post"
def main():
uvicorn.run("run:app", host="0.0.0.0", reload=True, port=8001)
if __name__ == "__main__":
main()
在static/index.html
中,我有:
<!DOCTYPE html>
<html lang="en">
<head>
</head>
<body>
<section>
<form method="post" action="/a/b" enctype="multipart/form-data">
<div>
<p>Download:</p>
</div>
<div>
<input type="submit" value="Download"/>
</div>
</form>
</section>
</body>
</html>
我向http://127.0.0.1:8001/a
发送一个get请求,然后点击download
加载的按钮,它返回“get”
但是,我将应用程序更改为
import uvicorn
from fastapi import FastAPI
from fastapi.staticfiles import StaticFiles
app = FastAPI()
app.mount("/a", StaticFiles(directory="static", html=True))
@app.get("/a/b")
def download():
return "get"
@app.post("/a/b")
def ab():
return "post"
def main():
uvicorn.run("run:app", host="0.0.0.0", reload=True, port=8001)
if __name__ == "__main__":
main()
使用相同的HTML文件,我点击下载按钮,得到detail: "Method Not Allowed"
,因为它正在执行INFO: 127.0.0.1:58109 - "POST /b HTTP/1.1" 405 Method Not Allowed
我想使用mount,因为我想把js和css文件也放在那里,供index.html文件使用。我该怎么做?
1条答案
按热度按时间eyh26e7m1#
解决这个问题最简单的方法是先注册所有的
a/blahblah
路由,然后再注册a
。只是换个顺序:但是,在这种情况下,上传到
static
文件夹的名为b
的文件将无法访问。因为@app.get("/a/b")
将首先被调用。我建议重新设计路由结构,如果你想避免这种行为。Here is a full detailed answer