FastAPI:“导入错误:尝试在没有已知父包的情况下进行相对导入”

Roh*_*rma 10 python python-3.x swagger-ui fastapi

我是 FastAPI 的新手,在导入其他文件时遇到了这个问题。

\n

我收到错误:\xe2\x80\x8d\xe2\x80\x8d\xe2\x80\x8d\xe2\x80\x8d

\n
from . import schemas\nImportError: attempted relative import with no known parent package\n
Run Code Online (Sandbox Code Playgroud)\n

对于上下文,我从中导入的文件是一个名为 Blog 的文件夹。我看到某些 StackOverflow 答案说from . import schemas我应该写from Blog import schemas. 即使他们的解决方案是正确的,并且我在运行 python 程序时没有收到任何错误,当我尝试使用 uvicorn 运行 FastAPI 时,我收到此错误,并且我的本地主机页面未加载。

\n
  File "./main.py", line 2, in <module>\nfrom Blog import schemas\nModuleNotFoundError: No module named \'Blog\'\n
Run Code Online (Sandbox Code Playgroud)\n

文件结构如下所示:\n在此输入图像描述

\n

主文件的代码如下所示:

\n
from fastapi import FastAPI\nfrom Blog import schemas, models\nfrom database import engine\n\napp = FastAPI()\n\nmodels.Base.metadata.create_all(engine)\n\n\n@app.post(\'/blog\')\ndef create(request: schemas.Blog):\n    return request\n
Run Code Online (Sandbox Code Playgroud)\n

模式.py

\n
from pydantic import BaseModel\n\n\nclass Blog(BaseModel):\n    title: str\n    body: str\n
Run Code Online (Sandbox Code Playgroud)\n

数据库.py

\n
from sqlalchemy import create_engine\nfrom sqlalchemy.ext.declarative import declarative_base\nfrom sqlalchemy.orm import sessionmaker\n\nSQLALCHAMY_DATABASE_URL = \'sqlite:///./blog.db\'\n\nengine = create_engine(SQLALCHAMY_DATABASE_URL, connect_args={"check_same_thread": False})\n\nSessionLocal = sessionmaker(bind=engine, autocommit=False, autoflush=False)\n\nBase = declarative_base()\n
Run Code Online (Sandbox Code Playgroud)\n

模型.py

\n
from sqlalchemy import *\nfrom database import Base\n\n\nclass Blog(Base):\n    __tablename__ = \'blogs\'\n    id = Column(Integer, primary_key=True, index=True)\n    title = Column(String)\n    body = Column(String)\n
Run Code Online (Sandbox Code Playgroud)\n

SwaggerUI 也没有加载。

\n

任何帮助将不胜感激!:)

\n

Mat*_*ias 12

您还可以从上面的文件夹运行您的应用程序。例如,如果你使用 uvicorn,你可以这样做

uvicorn folder.main:app --reload
Run Code Online (Sandbox Code Playgroud)

代替

uvicorn main:app --reload
Run Code Online (Sandbox Code Playgroud)

那么你可以保留这个点。


Chr*_*ris 7

由于您的schemas.py和文件与您的文件models.py位于同一目录main.py中,因此您应该按如下方式导入这两个模块,而不是使用from Blog import schemas, models

import schemas, models
Run Code Online (Sandbox Code Playgroud)

有关更多详细信息和示例,请查看此答案以及此答案此答案