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()
개체가 실제로 이름이 지정된 개체에 할당되었습니다.app
에main.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
다음을 가리키는 말:
main
서류철main.py
(Python "모듈").app
내부에 생성된 물체main.py
의 방침에app = FastAPI()
--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
(위 폴더와 동일한 이름), 앱을 실행할 때 오류가 발생합니다.
따라서 서로 충돌하지 않도록 폴더 이름을 변경하거나 파일 이름을 변경하는 것이 해결책입니다.
- 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
'itsource' 카테고리의 다른 글
macOS에 Composer를 설치하는 동안 오류가 발생했습니다(JIT 컴파일 실패). (0) | 2023.08.15 |
---|---|
ASP에서 null을 반환할 때 jQuery post JSON이 실패합니다.NET MVC (0) | 2023.08.15 |
jQuery 대화상자의 버튼을 기능에서 비활성화하려면 어떻게 해야 합니까? (0) | 2023.08.15 |
Java에서 Oracle로 대량 삽입 (0) | 2023.08.15 |
PowerShell ISE 내의 함수 호출 (0) | 2023.08.15 |