css FastAPI挂载StaticFiles示例返回405 Method Not Allowed响应

hof1towb  于 2023-05-19  发布在  其他
关注(0)|答案(1)|浏览(173)

我有这个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文件使用。我该怎么做?

eyh26e7m

eyh26e7m1#

解决这个问题最简单的方法是先注册所有的a/blahblah路由,然后再注册a。只是换个顺序:

@app.get("/a/b")
def ...

@app.post("/a/b")
def ...

app.mount("/a", StaticFiles(directory="static", html=True))

但是,在这种情况下,上传到static文件夹的名为b的文件将无法访问。因为@app.get("/a/b")将首先被调用。我建议重新设计路由结构,如果你想避免这种行为。

Here is a full detailed answer

相关问题