【问题标题】:FastAPI with uvicorn getting 404 Not Found error带有 uvicorn 的 FastAPI 获得 404 Not Found 错误
【发布时间】:2021-04-12 10:20:06
【问题描述】:

我正在尝试(失败)设置一个简单的 FastAPI 项目并使用 uvicorn 运行它。 这是我的代码:

from fastapi import FastAPI

app = FastAPI()

app.get('/')

def hello_world():
    return{'hello':'world'}

app.get('/abc')

def abc_test():
    return{'hello':'abc'}

这是我从终端运行的:

PS C:\Users\admin\Desktop\Self pace study\Python\Dev\day 14> uvicorn server2:app   
INFO:     Started server process [3808]
INFO:     Waiting for application startup.
INFO:     Application startup complete.
INFO:     Uvicorn running on http://127.0.0.1:8000 (Press CTRL+C to quit)
INFO:     127.0.0.1:60391 - "GET / HTTP/1.1" 404 Not Found
INFO:     127.0.0.1:60391 - "GET /favicon.ico HTTP/1.1" 404 Not Found

如您所见,我收到 404 Not found。可能是什么原因?一些与网络相关的东西,可能是防火墙/vpn 阻止了这个连接或其他什么?我是新手。 提前致谢!

【问题讨论】:

  • 您需要使用 @app.get(...)装饰路由器,而不仅仅是 app.get()

标签: python fastapi uvicorn


【解决方案1】:

你需要使用这样的装饰器:@app.get('/')。看看FastAPI Docs

此外,请看一下装饰器的一般工作原理,以更好地了解幕后的工作原理。

为您提供一些资源:

python docs

one of many articles I was able to find

another SO question

【讨论】:

  • 谢谢。这就是问题所在。
  • 别的东西,所以我不会打开另一个问题 - 如果你碰巧知道 - 每次我重新启动终端以再次安装 fastAPI、uvicorn 和 pipenv 后都会被问到,否则它的行为就像他们不存在……?为什么会这样? Visual Studio 代码,Python 3.8
  • 对我来说,这听起来像是一个虚拟环境问题,VSCode 或您的终端无法正确识别它。你用的是VSCode集成终端吗?也许考虑为python环境here设置VSCode。我认为这至少应该让你在一个像样的地方做更多的研究,之后我认为如果你找不到任何东西,另一个问题是合适的。由于您使用的是 pipenv,VSCode 应该与它很好地集成,并通过 pipenv install 查看您安装的所有内容。
  • 是的,这正是 VSCode 设置为使用 Python 的方式(因为我几周前使用与您粘贴的链接相同的指南设置它)并且我使用 VSCode 终端。无论如何,感谢您的帮助伙伴,如果我发现问题所在,我会继续挖掘并发布。干杯。
【解决方案2】:

现在你可能已经想通了。为了让 MWE 运行,您将在每个函数定义之前使用微服务的端点 decorators。以下 sn-p 应该可以解决您的问题。 它假定您具有以下结构:

.
+-- main.py
+-- static
|   +-- favicon.ico
+-- templates
|   +-- index.html
from fastapi import FastAPI
from fastapi.responses import HTMLResponse, FileResponse
from fastapi.staticfiles import StaticFiles
from fastapi.templating import Jinja2Templates
import os

app = FastAPI()

app.mount("/static", StaticFiles(directory="static"), name="static")

templates = Jinja2Templates(directory="templates")

@app.get('/')
def hello_world():
    return{'hello':'world'}

@app.get('/favicon.ico')
async def favicon():
    file_name = "favicon.ico"
    file_path = os.path.join(app.root_path, "static")
    return FileResponse(path=file_path, headers={"Content-Disposition": "attachment; filename=" + file_name})

@app.get('/abc')
def abc_test():
    return{'hello':'abc'}

所以你已经准备好使用 FastAPI 默认 ASGI 服务器运行你的第一个应用程序了。

(env)$: uvicorn main:app --reload --host 0.0.0.0 --port ${PORT}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-05-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-10-16
    • 2012-09-13
    相关资源
    最近更新 更多