itsource

FastAPI에서 오류가 발생합니다(ASGI 앱 로드 오류).모듈 "api"를 가져올 수 없습니다.)

mycopycode 2023. 8. 15. 11:06
반응형

FastAPI에서 오류가 발생합니다(ASGI 앱 로드 오류).모듈 "api"를 가져올 수 없습니다.)

나는 빨리 달리려고 노력했습니다.uvicorn 웹 서버를 사용하는 API이지만 오류가 발생합니다.

난 이 명령을 실행합니다.

uvicorn api:app --reload --host 0.0.0.0

하지만 터미널에 오류가 있습니다.

Uvicorn running on http://0.0.0.0:8000 (Press CTRL+C to quit)
Started reloader process [23445]
Error loading ASGI app. Could not import module "api".
Stopping reloader process [23445]

TL;DR

파일 이름 앞에 디렉터리 이름 추가

uvicorn src.main:app 

또는cd그 디렉토리에.

cd src
uvicorn main:app 

긴 대답

사용자가 Fast와 동일한 폴더에 있지 않기 때문에 발생합니다.API 앱 인스턴스는 구체적으로 다음과 같습니다.

이런 앱 트리가 있다고 가정해 보겠습니다.

my_fastapi_app/
├── app.yaml
├── docker-compose.yml
├── src
│   └── main.py
└── tests
    ├── test_xx.py
    └── test_yy.py

$ pwd         # Present Working Directory
/home/yagiz/Desktop/my_fastapi_app

앱 인스턴스와 동일한 폴더에 있지 않기 때문에 UVICON으로 앱을 실행하려고 하면 당신과 같은 오류가 발생합니다.

$ uvicorn main:app --reload
INFO:     Uvicorn running on http://127.0.0.1:8000 (Press CTRL+C to quit)
INFO:     Started reloader process [40645] using statreload
ERROR:    Error loading ASGI app. Could not import module "main".

답은 매우 간단합니다. 파일 이름 앞에 폴더 이름을 추가하십시오.

uvicorn src.main:app --reload

또는 작업 디렉토리를 변경할 수 있습니다.

cd src 

이제 앱 인스턴스가 있는 폴더 안에 있습니다.

src
└── main.py

당신의 uvicorn을 다시 실행하세요.

$ uvicorn main:app --reload
INFO:     Uvicorn running on http://127.0.0.1:8000 (Press CTRL+C to quit)
INFO:     Started reloader process [40726] using statreload
INFO:     Started server process [40728]
INFO:     Waiting for application startup.
INFO:     Application startup complete.

이러한 현상이 발생할 수 있는 한 가지 이유는 다음을 사용하고 있기 때문입니다.

uvicorn src/main:app --reload    

올바른 구문 대신:

uvicorn src.main:app --reload 

/ 대신 .을 확인합니다.
현재 단말기의 자동 완성은 잘못된 형식을 제시합니다.


이는 다음과 같이 가정합니다.

당신의 구조는 다음과 같습니다.

project_folder/
├── some_folder
├── src
│   └── main.py
└── tests
    ├── test_xx.py
    └── test_yy.py

당신의FastAPI()개체가 실제로 이름이 지정된 개체에 할당되었습니다.appmain.py:

app = FastAPI()

당신은 uvicorn 명령을 실행하고 있습니다.project_folder예:

(venv) <username>@<pcname>:~/PycharmProjects/project_folder$ uvicorn src.main:app --reload

저도 같은 문제가 있었고 메인 이전에 패키지 이름을 추가하여 해결했습니다. 당신의 경우:

uvicorn src.main:app --reload

문제를 해결할 수도 있습니다.

이것은 제가 서류를 빨리 보는 데 효과가 있었습니다.API. 파이썬 스크립트의 이름을 지정해야 하기 때문에 우연히 알게 되어 매우 감사합니다.main.py것은 아니다.app.py

명령어uvicorn main:app다음을 가리키는 말:

  1. main서류철main.py(Python "모듈").
  2. app내부에 생성된 물체main.py의 방침에app = FastAPI()
  3. --reload코드 변경 후 서버를 재시작합니다.개발용으로만 사용합니다.

이 오류의 또 다른 이유는 파일 간에 순환 참조가 있기 때문입니다.

예:

  • main.py:

    from tools import validator
    
    # ...
    
    class GlobalException(Exception):
        # ...
    
  • /tools/validator.py:

    from main import GlobalException
    

파일 이름을 main.py 로 지정하는 것이 중요한 것 같습니다. 그렇지 않으면 작동하지 않을 것입니다.

편집: 사실 저는 포트 8888에서 주피터 노트북을 실행하고 있었기 때문에 해당 포트는 이미 사용 중이었습니다.만약 당신이 주피터 노트북을 실행해야 한다면 API 서버를 실행한 후 실행하면 노트북은 자동으로 8889에서 실행됩니다.또는 API 서버를 다른 포트에서 실행할 수 있습니다.

저는 또한 FastAPI의 완전한 초보자인 Yagiz Degirmenci가 제공한 솔루션이 저와 같은 초보자를 위한 간단한 아이디어를 생각해 내는 데 도움이 되는 동일한 문제에 직면했습니다.

cd directory of code
uvicorn fast-api:main --reload 

PS. fast-api는 내 파일의 이름입니다(예: fast-api.py ).

파일을 저장하지 않은 경우 이 오류가 발생할 수 있으므로 VS Code 등에서 Save(저장) 버튼을 누릅니다.나한테 일어난 일.

주 디렉터리가 상위 디렉터리에 있는 이 폴더 구조 및 구성 사용

launch.json

{
    // Use IntelliSense to learn about possible attributes.
    // Hover to view descriptions of existing attributes.
    // For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387
    "version": "0.2.0",
    "configurations": [
        {
            "name": "Python: FastAPI",
            "type": "python",
            "request": "launch",
            "module": "uvicorn",
            "args": [
                "main:app"
            ],
            "jinja": true
        }
    ]
}

main.py

from fastapi import FastAPI
app = FastAPI(
    title="test",
    description="test",
    version="0.0.1",
)
if __name__ == "__main__":
import uvicorn

uvicorn.run(
    "main:app",
    host="0.0.0.0",
    reload=True,
    port=3001,
)

또한 이 오류의 또 다른 이유는 다음과 같습니다.

실행 중인 폴더와 정확히 같은 이름의 파일이 이미 있습니다. 그러면 시스템에 충돌이 발생합니다.

를 들어, 에 ": 예이지폴더안있다습니파일이에"라는 .test_app/main.py그럼 당신은 뛰어야 합니다.uvicorn test_app.main:app --reload앱을 실행합니다.

하지만, 만약 당신이 이름이 붙은 파일을 가지고 있다면.test_app.py(위 폴더와 동일한 이름), 앱을 실행할 때 오류가 발생합니다.

enter image description here

따라서 서로 충돌하지 않도록 폴더 이름을 변경하거나 파일 이름을 변경하는 것이 해결책입니다.

  • 1단계: 기본 파일이 터미널/명령 프롬프트의 동일한 디렉토리에 있는지 확인합니다.ls
(virtual-env) shayon@shayon-X556UQK:~/Documents/python-fast-api$ ls
main.py  __pycache__  README.md  requirements.txt  virtual-env
  • 2단계 - 다음을 사용하여 단말기의 디렉토리를 확인합니다.pwd
(virtual-env) shayon@shayon-X556UQK:~/Documents/python-fast-api$ pwd
/home/shayon/Documents/python-fast-api
  • 3단계 - 개체 이름 확인 - 여기app는 Fast의의 입니다.를 사용해야 합니다.uvicorn main:app --reload 이름을 app1당신은 뛰어야 합니다.uvicorn main:app1 --reload
(virtual-env) shayon@shayon-X556UQK:~/Documents/python-fast-api$ cat main.py

main.py

from fastapi import FastAPI
app = FastAPI()


@app.get("/")
def index():
    return {"Hello": "World"}
  • Step-4 제 경우, 다음 명령을 실수했습니다.uvicorn main.py:app --reload그리고 이것이 제 실수의 이유였습니다.는 "" " " " " 입니다."여야 .uvicorn main:app --reload 확장자 확트장없음도없))

이 도움을 바랍니다 - 즐기세요 :)

Pycharm을 사용하는 경우 소스 디렉토리가 올바르게 설정되지 않은 것이 원인일 수 있습니다.예를 들어, 도커 컴포지를 사용하여 Python 원격 디버거를 구성하려고 했는데 폴더 구조가 다음과 같습니다.

my_app_name
├── docker-compose.yml
├── src
│   └── main.py
└── tests
    ├── test_file1.py
    └── test_file2.py

저는 루트 폴더 안에 src 폴더를 가지고 있었는데, 거기에는 main.py 파일이 들어 있었습니다.PyCharm 프로젝트 설정에서 소스 폴더는 기본적으로 루트로 설정됩니다.그러나 위의 경우와 같이 중첩된 구조를 가진 경우 기본 설정 ->프로젝트 ->프로젝트 구조 ->소스로 이동한 후 소스 폴더 아래에 src 폴더를 추가해야 합니다.

저는 제 메인에서 다음을 사용하여 이 문제를 해결했습니다.

import uvicorn

app = FastAPI()

@app.get("/")
def index():
    return {"index": "root"}

if __name__ == '__main__':

    uvicorn.run(f"{Path(__file__).stem}:app", host="127.0.0.1", port=8888, reload=True)

그리고 터미널에서, 저는 타이핑을 했습니다.uvicorn main:app --reload 내 main.py 이 내 루트 폴더에 있기 때문입니다.

uvicorn.py , 폴더 동일한 이름, 패키지 이름과 같은 파이썬 파일에 동일한 이름을 지정하지 마십시오.

언급URL : https://stackoverflow.com/questions/60819376/fastapi-throws-an-error-error-loading-asgi-app-could-not-import-module-api

반응형