묻고 답해요
130만명의 커뮤니티!! 함께 토론해봐요.
인프런 TOP Writers
-
해결됨실전! FastAPI 입문
코드 질문
안녕하세요.파이썬 2.7만 주로 쓰다 오랜만에 쓰니 좀 헷갈리는게 있어 질문드립니다.encoding: str = "UTF-8"service 작성하시면서 설명해주신 코드인데,encoding = "UTF - 8" 이렇게 써도 encoding 변수에 뭐가 들어가는지 바로 확인이 되는데 굳이 : str 과 타입을 명시할 이유가 있나요 ? 이렇게 작성하였을 때 왜 이렇게 작성하고 어떠한 장점이 있는지 궁금합니다.비슷한 질문으로 def save_user(self, user: User) -> User:다음과 같이 반환 타입을 적어줘야 하는 것도 설명 부탁드립니다.작성하면서도 이걸 굳이 적어줘야 하는지가 궁금해서 질문드립니다.
-
해결됨실전! FastAPI 입문
router testcode 문의
router test code 에서 test_main.py 파일에 api.todo라고 main을 바꾸어 줬는데 import를 따로 안 시켜줘도 되나요 ?main.py는 from api import todo로 import 시키는데 test_main.py는 안 그래도 되는지 궁금합니다.
-
해결됨실전! FastAPI 입문
docker 설치 에러
안녕하세요.윈도우 os 사용중이고 docker desktop 설치 시 이후데몬이 활성화가 안되어 질문드립니다.데몬 활성화를 위해서는 가상화 지원이 되어야 하는데, bios 세팅 및 os 가상화 설정을 모두 하여서 작업관리자에서 가상화:사용 이라고 까지 표기가 되어도 하이퍼바이저 지원이 안된다는 에러가 나옵니다.wsl 설치 또한 가상화가 지원이 안된다는 에러와 함께 설치가 안되어 구글링 이후 문의 드립니다.
-
해결됨실전! FastAPI 입문
uvicorn 실행 에러
안녕하세요.학습 도중 재부팅하여 다시 uvicorn 실행하려고 하니ERROR: Error loading ASGI app. Could not import module "main". 다음과 같은 메세지가 나오면서 fast api 앱이 실행이 안되는데 이유가 궁금합니다.
-
해결됨실전! FastAPI 입문
src 디렉토리를 기본으로 설정하는 방
from main import app이 아닌from src.main import app을 하게 되면 에러가 발생합니다. src. 을 생략할 수 있도록 하는 방법이 없을까요
-
해결됨실전! FastAPI 입문
session.scalar(select(1)) 에러 발생 질문입니다.
에러명은 다음과 같습니다. 도커 설정은 이상이 없는데 어디서 문제가 생긴걸까요pymysql.err.OperationalError: (2003, "Can't connect to MySQL server on '127.0.0.1' ([WinError 10061] 대상 컴퓨터에서 연결을 거부했으므로 연결하지 못했습니다)")The above exception was the direct cause of the following exception:
-
해결됨실전! FastAPI 입문
DATABASE_URL 상수변수 질문
도커를 이용해 컨테이너를 실행시킬 때 root 사용자에 대해서 todos라는 비밀번호를 갖도록 설정을 해주었는데, DATABASE_URL = "mysql+pymysql://root:todos@127.0.0.1:3306/todos"상수 변수를 이용해 데이터베이스 연결 시도 시,(1045, "Access denied for user 'root'@'localhost' (using password: YES)") 이런 에러가 발생합니다.비밀번호를 설정하였는데도 왜 이렇게 발생하는 건가요?
-
해결됨실전! FastAPI 입문
(실습) ORM 적용 - HTTP Response 처리
from typing import List from fastapi import FastAPI, Body, HTTPException, Depends from pydantic import BaseModel from sqlalchemy.orm import Session from database.orm import ToDo from database.connection import get_db from database.repository import get_todos from schema.response import ListToDoResponse, ToDoSchema app = FastAPI() @app.get("/") def heath_check_handler(): return {"ping": "pong"} todo_data = { 1: { "id": 1, "contents": "실전! FastAPI 섹션 0 수강", "is_done": True, }, 2: { "id": 2, "contents": "실전! FastAPI 섹션 1 수강", "is_done": False, }, 3: { "id": 3, "contents": "실전! FastAPI 섹션 2 수강", "is_done": False, }, } @app.get("/todos", status_code=200) def get_todos_handler( order: str | None = None, session: Session = Depends(get_db), ) -> ListToDoResponse: todos: List[ToDo] = get_todos(session=session) if order and order == "DESC": return ListToDoResponse( todos=[ToDoSchema.from_orm(todo) for todo in todos[::-1]] ) return ListToDoResponse( todos=[ToDoSchema.from_orm(todo) for todo in todos] ) @app.get("/todos/{todo_id}", status_code=200) def get_todo_handler(todo_id: int): todo = todo_data.get(todo_id) if todo: return todo raise HTTPException(status_code=404, detail="ToDo Not Found") class CreateToDoRequest(BaseModel): id: int contents: str is_done: bool @app.post("/todos", status_code=201) def create_todo_handler(request: CreateToDoRequest): todo_data[request.id] = request.dict() return todo_data[request.id] @app.patch("/todos/{todo_id}", status_code=200) def update_todo_handler( todo_id: int, is_done: bool = Body(..., embed=True) ): todo = todo_data.get(todo_id) if todo: todo["is_done"] = is_done return todo raise HTTPException(status_code=404, detail="ToDo Not Found") @app.delete("/todos/{todo_id}") def delete_todo_handler(todo_id: int): todo = todo_data.pop(todo_id, None) if todo: return raise HTTPException(status_code=404, detail="ToDo Not Found") from typing import List from pydantic import BaseModel class ToDoSchema(BaseModel): id: int contents: str is_done: bool class Config: orm_mode = True class ListToDoResponse(BaseModel): todos: List[ToDoSchema] from typing import List from sqlalchemy import select from sqlalchemy.orm import Session from database.orm import ToDo def get_todos(session: Session) -> List[ToDo]: return list(session.scalars(select(ToDo))) from sqlalchemy import create_engine from sqlalchemy.orm import sessionmaker DATABASE_URL = "mysql+pymysql://root:todos@127.0.0.1:3306/todos" engine = create_engine(DATABASE_URL, echo=True) SessionFactory = sessionmaker(autocommit=False, autoflush=False, bind=engine) def get_db(): session = SessionFactory() try: yield session finally: session.close() from sqlalchemy import Boolean, Column, Integer, String from sqlalchemy.orm import declarative_base Base = declarative_base() class ToDo(Base): __tablename__ = 'todo' id = Column(Integer, primary_key=True, index=True) contents = Column(String(256), nullable=False) is_done = Column(Boolean, nullable=False) def __repr__(self): return f"ToDo(id={self.id}, contents={self.contents}, is_done={self.is_done})" 에러가 납니다. 파이썬 콘솔 <input>:1: PydanticDeprecatedSince20: The from_orm method is deprecated; from schema.response import ToDoSchemafrom datagbase.orm import ToDoTraceback (most recent call last):File "C:\Program Files\JetBrains\PyCharm 2023.3.2\plugins\python\helpers\pydev\pydevconsole.py", line 364, in runcodecoro = func()^^^^^^File "<input>", line 1, in <module>File "C:\Program Files\JetBrains\PyCharm 2023.3.2\plugins\python\helpers\pydev\_pydev_bundle\pydev_import_hook.py", line 21, in do_importmodule = self._system_import(name, args, *kwargs)^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ModuleNotFoundError: No module named 'datagbase'from database.orm import ToDotodo = ToDo(id=100, contents="test", is_done=True)ToDoSchema.from_orm(todo)<input>:1: PydanticDeprecatedSince20: The from_orm method is deprecated; set model_config['from_attributes']=True and use model_validate instead. Deprecated in Pydantic V2.0 to be removed in V3.0. See Pydantic V2 Migration Guide at https://errors.pydantic.dev/2.5/migration/Traceback (most recent call last):File "C:\Program Files\JetBrains\PyCharm 2023.3.2\plugins\python\helpers\pydev\pydevconsole.py", line 364, in runcodecoro = func()^^^^^^File "<input>", line 1, in <module>File "C:\Users\manag\pyProject\todos\Lib\site-packages\typing_extensions.py", line 2499, in wrapperreturn arg(*args, **kwargs)^^^^^^^^^^^^^^^^^^^^File "C:\Users\manag\pyProject\todos\Lib\site-packages\pydantic\main.py", line 1126, in from_ormraise PydanticUserError(pydantic.errors.PydanticUserError: You must set the config attribute from_attributes=True to use from_orm http://localhost:8000/docs#/default/get_todos_handler_todos_get접속시 터미널INFO: 127.0.0.1:56312 - "GET /docs HTTP/1.1" 200 OKINFO: 127.0.0.1:56312 - "GET /openapi.json HTTP/1.1" 200 OK2024-01-23 16:06:15,108 INFO sqlalchemy.engine.Engine BEGIN (implicit)2024-01-23 16:06:15,109 INFO sqlalchemy.engine.Engine SELECT todo.id, todo.contents, todo.is_doneFROM todo2024-01-23 16:06:15,109 INFO sqlalchemy.engine.Engine [cached since 826.5s ago] {}2024-01-23 16:06:15,113 INFO sqlalchemy.engine.Engine ROLLBACKINFO: 127.0.0.1:56312 - "GET /todos HTTP/1.1" 500 Internal Server ErrorERROR: Exception in ASGI applicationTraceback (most recent call last):File "C:\Users\manag\pyProject\todos\Lib\site-packages\uvicorn\protocols\http\h11_impl.py", line 404, in run_asgiresult = await app( # type: ignore[func-returns-value]^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^File "C:\Users\manag\pyProject\todos\Lib\site-packages\uvicorn\middleware\proxy_headers.py", line 84, in callreturn await self.app(scope, receive, send)^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^File "C:\Users\manag\pyProject\todos\Lib\site-packages\fastapi\applications.py", line 1054, in callawait super().__call__(scope, receive, send)File "C:\Users\manag\pyProject\todos\Lib\site-packages\starlette\applications.py", line 123, in callawait self.middleware_stack(scope, receive, send)File "C:\Users\manag\pyProject\todos\Lib\site-packages\starlette\middleware\errors.py", line 186, in callraise excFile "C:\Users\manag\pyProject\todos\Lib\site-packages\starlette\middleware\errors.py", line 164, in callawait self.app(scope, receive, _send)File "C:\Users\manag\pyProject\todos\Lib\site-packages\starlette\middleware\exceptions.py", line 62, in callawait wrap_app_handling_exceptions(self.app, conn)(scope, receive, send)File "C:\Users\manag\pyProject\todos\Lib\site-packages\starlette\_exception_handler.py", line 64, in wrapped_appraise excFile "C:\Users\manag\pyProject\todos\Lib\site-packages\starlette\_exception_handler.py", line 53, in wrapped_appawait app(scope, receive, sender)File "C:\Users\manag\pyProject\todos\Lib\site-packages\starlette\routing.py", line 762, in callawait self.middleware_stack(scope, receive, send)File "C:\Users\manag\pyProject\todos\Lib\site-packages\starlette\routing.py", line 782, in appawait route.handle(scope, receive, send)File "C:\Users\manag\pyProject\todos\Lib\site-packages\starlette\routing.py", line 297, in handleawait self.app(scope, receive, send)File "C:\Users\manag\pyProject\todos\Lib\site-packages\starlette\routing.py", line 77, in appawait wrap_app_handling_exceptions(app, request)(scope, receive, send)File "C:\Users\manag\pyProject\todos\Lib\site-packages\starlette\_exception_handler.py", line 64, in wrapped_appraise excFile "C:\Users\manag\pyProject\todos\Lib\site-packages\starlette\_exception_handler.py", line 53, in wrapped_appawait app(scope, receive, sender)File "C:\Users\manag\pyProject\todos\Lib\site-packages\starlette\routing.py", line 72, in appresponse = await func(request)^^^^^^^^^^^^^^^^^^^File "C:\Users\manag\pyProject\todos\Lib\site-packages\fastapi\routing.py", line 299, in appraise eFile "C:\Users\manag\pyProject\todos\Lib\site-packages\fastapi\routing.py", line 294, in appraw_response = await run_endpoint_function(^^^^^^^^^^^^^^^^^^^^^^^^^^^^File "C:\Users\manag\pyProject\todos\Lib\site-packages\fastapi\routing.py", line 193, in run_endpoint_functionreturn await run_in_threadpool(dependant.call, **values)^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^File "C:\Users\manag\pyProject\todos\Lib\site-packages\starlette\concurrency.py", line 40, in run_in_threadpoolreturn await anyio.to_thread.run_sync(func, *args)^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^File "C:\Users\manag\pyProject\todos\Lib\site-packages\anyio\to_thread.py", line 56, in run_syncreturn await get_async_backend().run_sync_in_worker_thread(^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^File "C:\Users\manag\pyProject\todos\Lib\site-packages\anyio\_backends\_asyncio.py", line 2134, in run_sync_in_worker_threadreturn await future^^^^^^^^^^^^File "C:\Users\manag\pyProject\todos\Lib\site-packages\anyio\_backends\_asyncio.py", line 851, in runresult = context.run(func, *args)^^^^^^^^^^^^^^^^^^^^^^^^File "C:\Users\manag\pyProject\todos\src\main.py", line 48, in get_todos_handlertodos=[ToDoSchema.from_orm(todo) for todo in todos]^^^^^^^^^^^^^^^^^^^^^^^^^File "C:\Users\manag\pyProject\todos\Lib\site-packages\typing_extensions.py", line 2499, in wrapperreturn arg(*args, **kwargs)^^^^^^^^^^^^^^^^^^^^File "C:\Users\manag\pyProject\todos\Lib\site-packages\pydantic\main.py", line 1126, in from_ormraise PydanticUserError(pydantic.errors.PydanticUserError: You must set the config attribute from_attributes=True to use from_orm
-
미해결파이썬 동시성 프로그래밍 : 데이터 수집부터 웹 개발까지 (feat. FastAPI)
AWS Lightsail SSL handshake failed 오류 문의드립니다.
AWS Lightsail에 git clone을 하고, 콜렉터스 북북이 초기 페이지까지는 잘 들어가졌는데,검색어를 입력하고 엔터를 하면 오랜 시간이 지나고 아래와 같은 오류문이 나옵니다. INFO: 211.234.195.243:54254 - "GET /search?q=Sss HTTP/1.1" 500 Internal Server ErrorERROR: Exception in ASGI application... <ServerDescription ('ac-ljyn7zm-shard-00-02.v7fc0ev.mongodb.net', 27017) server_type: Unknown, rtt: None, error=AutoReconnect("SSL handshake failed: ac-ljyn7zm-shard-00-02.v7fc0ev.mongodb.net:27017: [('SSL routines', 'ssl3_read_bytes', 'tlsv1 alert internal error')] (configured timeouts: socketTimeoutMS: 20000.0ms, connectTimeoutMS: 20000.0ms)")>]> 이런 오류가 나오면서 Internal Server Error가 뜹니다.혹시 어떻게 해결을 해야할지 알 수 있을까요?
-
해결됨실전! FastAPI 입문
test 코드 질문
강의 너무 잘보고 있습니다test 코드 실습 중에 생긴 문제인데요def test_update_todo(client, mocker): mocker.patch.object(ToDoRepository, "get_todo_by_todo_id", return_value=ToDo(id=1, contents="todo", is_done=True)) mocker.patch.object(ToDoRepository, "update_todo", return_value=ToDo(id=1, contents="todo", is_done=True)) body = { "is_done": False } response = client.patch("/todos/1", json=body) assert response.status_code == 200 assert response.json() == {"id": 1, "contents": "todo", "is_done": True} # 404 mocker.patch.object(ToDoRepository, "get_todo_by_todo_id", return_value=None) response = client.patch("/todos/1", json=body) assert response.status_code == 404 assert response.json() == {"detail": "ToDo Not Found"}이런식으로 test 코드를 작성한 다음에 리팩토링 과정에서 잘못선택되서 todo_id가 빠진 상태로 코드를 올렸습니다@router.patch("/{todo_id}", status_code=200) def update_todo_handler( todo_id: int, is_done: bool = Body(..., embed=True), todo_repo: ToDoRepository = Depends()): todo: ToDo | None = todo_repo.get_todo_by_todo_id() # 이 부분 todo_id를 빼버림 if todo: todo.done() if is_done else todo.undone() todo: ToDo = todo_repo.update_todo(todo) return ToDoSchema.from_orm(todo) else: raise HTTPException(status_code=404, detail="ToDo Not Found")이게 제가 잘못 작성한 코드고 todo.get_todo_by_todo_id 함수에 parameter를 안넣고 pytest를 실행해도 mocker.patch로 지정된 값이 넘어오게 되니까 에러가 나지 않더라구요 실행하면 당연히 500 internal error가 발생하는데 혹시 이런 경우까지 방지하도록 test 코드를 바꾼다면 어떻게 바꿔야할까요?
-
해결됨실전! FastAPI 입문
sqlalchemy delete 관련 질문
def delete_todo(session: Session, todo: ToDo) -> None: session.execute(delete(ToDo).where(ToDo.id == ToDo.id)) session.commit()Delete 부분 구현을 이렇게 하셨는데 session.delete 말고 session.execute 로 구현하신 이유가 있을까요?sqlalchemy documentation에서도 example에는 이런식으로 되어있는데# mark two objects to be deleted session.delete(obj1) session.delete(obj2) # commit (or flush) session.commit()혹시 제가 모르는 인사이트가 있으신가 조심스레 여쭤봅니다
-
미해결파이썬 동시성 프로그래밍 : 데이터 수집부터 웹 개발까지 (feat. FastAPI)
동시성과 병렬성
설명을 잘 해주셔서 이해가 잘 됐습니다.node js 에서는 싱글 스레드로 돌아가고 있고 ,코드를 작성하게 될때 , async await 를 붙여서동시성 작업을 많이 하는걸로 알고있습니다. 이는 싱글스레드라 할지라도 엔진상 속도가 잘 나오기 때문에 괜찮다고 들었는데요 python 입장에서는 어떤가요 ??
-
미해결파이썬 동시성 프로그래밍 : 데이터 수집부터 웹 개발까지 (feat. FastAPI)
python select linter ? 오류
- 학습 관련 질문을 남겨주세요. 상세히 작성하면 더 좋아요! - 먼저 유사한 질문이 있었는지 검색해보세요. - 서로 예의를 지키며 존중하는 문화를 만들어가요. - 잠깐! 인프런 서비스 운영 관련 문의는 1:1 문의하기를 이용해주세요. python :select linter를 입력해도 값이 나오지 않습니다. 왜그럴가요?
-
미해결파이썬 동시성 프로그래밍 : 데이터 수집부터 웹 개발까지 (feat. FastAPI)
수업질문
안녕하세요 수업을 듣고있는 한 사람입니다 ㅎㅎ 너무 잘 듣고있습니다.수업을 들으면서 궁금한점은 검색과 chat gpt 를 통해서 찾아보고있는데요. 단순 chat gpt 의 결과이지만 코루틴은 주로 I/O 바운드와 고수준 구조화된 네트워크 코드에 사용되며, CPU 바운드 작업에는 적합하지 않을 수 있습니다. CPU 바운드 작업을 비동기적으로 처리하려면 멀티 프로세싱이나 다른 접근 방법을 고려해야 할 수 있습니다. 라고 하더라구요 .혹시 여기에 대해서는 어떻게 생각하시나요 ?
-
미해결파이썬 동시성 프로그래밍 : 데이터 수집부터 웹 개발까지 (feat. FastAPI)
response 객체에서 키값으로 조회 시 KeyError 발생
- 학습 관련 질문을 남겨주세요. 상세히 작성하면 더 좋아요! - 먼저 유사한 질문이 있었는지 검색해보세요. - 서로 예의를 지키며 존중하는 문화를 만들어가요. - 잠깐! 인프런 서비스 운영 관련 문의는 1:1 문의하기를 이용해주세요. 안녕하세요,강의 2:17 부분을 보면서 따라해보고 있는데 아래 부분에서 KeyError가 발생합니다.items = result["items"] 구체적인 에러 메시지는 다음과 같습니다result 객체의 키값만 조회해보면 items가 정상적으로 존재하고, reult의 타입도 dict 형태로 나오는데 왜 keyerror가 발생하는걸까요..?
-
해결됨실전! FastAPI 입문
Uvicorn을 이용한 API 외부서버 접속이 가능한가요?
안녕하세요 강사님 해당 내용을 아무리 찾아봐도 보편적으로 배포에 관련한 내용들이 로컬 호스트로 접속하는것 또는 aws등의 외부 서버를 통해서 배포하는 방식위주로 설명이되어있는데, uvicorn을 사용해서 저희 실습을 기준으로는 uvicorn main:app --host 0.0.0.0 --port 8000이런식으로 실행하면 컴퓨터를 켜 놓고있는 동안 외부에서http://(내 ip주소):8000이런식으로 접근이 가능하게 하고 싶은데(앞선 방법으론 시도해 봤는데 무한로딩이 뜨더라구요) 이런식의 배포는 불가능한지, 가능하면 어떻게 진행하면되는지 궁금합니다!
-
미해결배달앱은 어떻게 내 주변의 맛집을 찾을까?
test.sh 파일 실행 후 에러 처리 방법
질문하실 땐 https://gist.github.com/ 를 사용하시면 코드를 쉽게 공유할 수 있습니다!원하고자 하는 것실제 작성한 코드실행한 결과원하는 결과이렇게 4가지를 꼭 적어주셔야 도와드릴 수 있습니다 :) 처음 프로젝트를 실행 후 test.sh 파일을 실행했는데에러가 두개 발생했습니다.에러 처리는 어떻게 하나요?제 에러는 첨부한 사진과 같습니다.파이썬(3.11.3), poetry(1.4.2) 모두 강의에 나온 버전 설치했습니다.
-
해결됨배달앱은 어떻게 내 주변의 맛집을 찾을까?
테스트를 실행했을 때 RuntimeError: Event loop is closed 에러가 발생합니다.
질문하실 땐 https://gist.github.com/ 를 사용하시면 코드를 쉽게 공유할 수 있습니다!원하고자 하는 것실제 작성한 코드실행한 결과원하는 결과 이렇게 4가지를 꼭 적어주셔야 도와드릴 수 있습니다 :) test_shop_insert_one() 함수를 추가하여 테스트를 실행했을 때 RuntimeError: Event loop is closed 에러가 발생하여 테스트가 실패합니다. app/tests/entities/collections/shop/test_shop_collection.py F [100%] ============================================================================= FAILURES ============================================================================= _______________________________________________________________________ test_shop_insert_one _______________________________________________________________________ @pytest.mark.asyncio async def test_shop_insert_one() -> None: # Given name = "치킨집" category_codes = [CategoryCode.CHICKEN] delivery_areas = [ ShopDeliveryAreaSubDocument( poly=GeoJsonPolygon(coordinates=[[[0, 0], [0, 10], [10, 10], [10, 0], [0, 0]]]), ) ] # When > shop = await ShopCollection.insert_one(name, category_codes, delivery_areas) app/tests/entities/collections/shop/test_shop_collection.py:21: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ app/entities/collections/shop/shop_collection.py:20: in insert_one result = await cls._collection.insert_one( /PATH/OF/POETRY/CACHE/lib/python3.11/site-packages/motor/metaprogramming.py:73: in method return framework.run_on_executor( /PATH/OF/POETRY/CACHE/lib/python3.11/site-packages/motor/frameworks/asyncio/__init__.py:85: in run_on_executor return loop.run_in_executor(_EXECUTOR, functools.partial(fn, *args, **kwargs)) /PATH/OF/PYTHON/lib/python3.11/asyncio/base_events.py:816: in run_in_executor self._check_closed() _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = <_UnixSelectorEventLoop running=False closed=True debug=False> def _check_closed(self): if self._closed: > raise RuntimeError('Event loop is closed') E RuntimeError: Event loop is closed /PATH/OF/PYTHON/lib/python3.11/asyncio/base_events.py:519: RuntimeError ===================================================================== short test summary info ====================================================================== FAILED app/tests/entities/collections/shop/test_shop_collection.py::test_shop_insert_one - RuntimeError: Event loop is closed =================================================================== 1 failed, 1 passed in 0.55s ====================================================================에러로그는 위와 같습니다. --async-mode 를 test로 변경해보면 저 단계까지 가기 전에 에러가 발생하고@pytest.mark.asyncio 어노테이션을 추가해줘도 결과는 같습니다.poetry 를 이용한 환경 구성이 처음이라 해당 지식이 많이 부족하여 이 문제를 어떻게 해결해야하는지 잘 모르겠습니다. 파이썬 버전은 3.11.3poetry 버전은 1.4.2mongodb 버전은 6.0.11 입니다. [tool.poetry.dependencies] fastapi = "^0.95.2" gunicorn = "^20.1.0" httpx = "^0.24.1" motor = "^3.1.2" orjson = "^3.8.14" python = "^3.11" uvicorn = "^0.22.0" [tool.poetry.group.dev.dependencies] black = {extras = ["d"], version = "^23.3.0"} coverage = "^7.2.3" isort = "^5.12.0" mypy = "^1.3.0" pytest = "^7.3.1" pytest-asyncio = "^0.21.0" toml-sort = "^0.23.0" 작성한 코드의 차이점은 db가 로컬에 있지 않고 외부에 있는 관계로def create_mongo_url(host: str = "localhost", port: int = 27017) -> str: return f"mongodb://{host}:{port}" DATABASE_NAME = os.environ.get("MONGO_DATABASE", "yorigin") HOST = os.environ.get("MONGO_HOST", "localhost") PORT = os.environ.get("MONGO_PORT", 27017) client = AsyncIOMotorClient(create_mongo_url(HOST, int(PORT)))이와 같은 코드를 추가하여 지정된 host의 mongodb와 통신할 수 있도록 한 것이 전부입니다. 확인 부탁드릴 수 있을까요?
-
해결됨실전! FastAPI 입문
(실습) ORM 적용 - GET 단일 조회 API
sqlalchemy.exc.OperationalError: (pymysql.err.OperationalError) (1045, "Access denied for user 'root'@'localhost' (using password: YES)")이와같은 오류가 발생하는데 https://www.inflearn.com/questions/1009261/orm%EC%A0%81%EC%9A%A9-postapi-%EA%B0%95%EC%9D%98이 분 글 보면 맨 마지막에 백그라운드에서 mysql이 실행되고있는걸 끄신걸로 해결하셨다는 것 같은데 그게 정확히 어떻게 하셨다는 건지 잘 모르겠고...ㅜㅜ 그게 저 오류랑 무슨 관계가 있었던건지도 궁금합니다.일단 오류를 검색해보고 추론해본 생각으로는 docker run -p 3306:3306 -e MYSQL_ROOT_PASSWORD=todos -e MYSQL_DATABASE=todos -d -v todos:/db --name todos mysql:8.0이걸로 만든 pw가 todos인 db에 접속하지 못한다는 내용인 것 같은데(이것도 맞는지 궁금합니다)1. 위 문제 해결방법2. 만약 pw가 문제라면 이를 연결하는 부분을 담당하는 코드(파일)가 connnection.py 의 내용인것 같은데 여기에 해당 db의 pw를 명시하는 부분이 있는지, 아니면 다른 곳에 위치하는지 궁금합니다(관련 글 찾아보던 중 해당 db의 pw자체를 없애라길래 없애지 않고 진행하는 방법은 없는건지 의문이 들어서 질문드립니다..!)
-
해결됨실전! FastAPI 입문
Service를 Depends 사용하는 것에 대해 질문이 있습니다.
(실습) 회원가입 API 구현 강의에서 질문이 있습니다.Depends가 Request 할때마다 객체를 생성하는 것으로 이해하고 있습니다.Depends를 테스트를 위해서 활용하는 것으로 이해했었는데, pyTest를 보면 mock.patch라는 기능으로 DI 없이 목킹을 잘 할 수 있는것으로 보았습니다.UserService를 Depends 처리하면, 요청마다 service를 생성할 것 같은데, 이러면 불필요한 생성과 소멸이 반복될 것 같은데, Depends를 쓰는게 좋을까요? 아니면 싱글톤으로 작성하는게 좋을까요?