묻고 답해요
143만명의 커뮤니티!! 함께 토론해봐요.
인프런 TOP Writers
-
미해결파이썬 동시성 프로그래밍 : 데이터 수집부터 웹 개발까지 (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를 쓰는게 좋을까요? 아니면 싱글톤으로 작성하는게 좋을까요?
-
미해결파이썬 동시성 프로그래밍 : 데이터 수집부터 웹 개발까지 (feat. FastAPI)
from config import get_secret 질문
"05-scraping.py" 파일에from config import get_secret --> 이 코드가 있는데요,제가 Linux에서 이 파일을 실행해 보면 위 코드에서 아래 에러가 납니다. 뭐가 문제인지요?ImportError: cannot import name 'get_secret' from 'config' (/home/sean2/.pyenv/versions/3.8.17/lib/python3.8/site-packages/config/__init__.py)
-
해결됨실전! FastAPI 입문
안녕하세요. fastapi 강의 수강 중입니다.
안녕하세요. fastapi 강의 수강 중입니다.섹션2에서 데이터베이스 생성과정 중docker exec -it todos bash를 하면Error response from daemon: Container c77ef59c10ff05ebd5ead765aa6f64ac185daa38214ad0fc5195750cace0b167 is not running위와 같은 에로가 나오는데요, 나름대로 구글링을 해보니까 docker start를 사용해 도커 실행을 해주면한다해서 해보면 Error response from daemon: Ports are not available: exposing port TCP 0.0.0.0:3306 -> 0.0.0.0:0: listen tcp 0.0.0.0:3306: bind: address already in use이러한 에러가 나옵니다.docker와 mysql을 연결하는 명령어에서 다 잘 다운로드되고 마지막에 docker: Error response from daemon: Ports are not available: exposing port TCP 0.0.0.0:3306 -> 0.0.0.0:0: listen tcp 0.0.0.0:3306: bind: address already in use.이런 에러가 뜨긴했는데 우선 넘어가보니 docker ps를 해보면 실행중인 컨테이너가 없습니다. 도커를 아예 처음 접하다보니 시작단계에서 어려움이 있는데 도움 부탁드립니다.
-
해결됨실전! FastAPI 입문
레포지토리 패턴 강의에 pytest 오류가 뜹니다
pytest 실행하면 FAILED tests/test_main.py::test_get_todos - assert 404 == 200FAILED tests/test_main.py::test_get_todo - assert 404 == 200FAILED tests/test_main.py::test_create_todo - AttributeError: 'NoneType' object has no attribute 'id'FAILED tests/test_main.py::test_update_todo - AssertionError: Expected 'undone' to be called once. Called 0 times.FAILED tests/test_main.py::test_delete_todo - AttributeError: <module 'api.todo' from 'C:\\Users\\user\\Desktop\\project\\todos\\src\\api\\todo.py'> does not have the attribute 'delete_todo'라는 오류가 뜹니다...ㅠㅠ
-
해결됨실전! FastAPI 입문
pydantic.error_wrappers.ValidationError 오류가 떠요
지금 orm적용 get단일 조회 api 강의를 보고있는데 코드를 똑같이 쳤는데 마지막에 swagger 에서 입력 하면 pydantic.error_wrappers.ValidationError: 3 validation errors for ToDoSchemaid field required (type=value_error.missing)content field required (type=value_error.missing)is_done field required (type=value_error.missing) 이 오류가 뜹니다..ㅠㅠ 무슨 오류인가요
-
해결됨실전! FastAPI 입문
ORM JOIN 강의를 따라하는 중 오류가...
파이썬 콘솔에서 아래 오류가 발생했어요...그래서 , pip install cryptography를 했지만 이미 설치되어 있었구요...(todos) C:\projects\todos>pip install cryptographyRequirement already satisfied: cryptography in c:\projects\todos\lib\site-packages (41.0.3)Requirement already satisfied: cffi>=1.12 in c:\projects\todos\lib\site-packages (from cryptography) (1.15.1) Requirement already satisfied: pycparser in c:\projects\todos\lib\site-packages (from cffi>=1.12->cryptography) (2.21)아래는 파이썬 콘솔창user = session.scalar(select(User))Traceback (most recent call last): File "C:\Program Files\JetBrains\PyCharm Community Edition 2023.2.1\plugins\python-ce\helpers\pydev\pydevconsole.py", line 364, in runcode coro = func() File "<input>", line 1, in <module> File "C:\projects\todos\venv\lib\site-packages\sqlalchemy\orm\session.py", line 2312, in scalar return self._execute_internal( File "C:\projects\todos\venv\lib\site-packages\sqlalchemy\orm\session.py", line 2134, in executeinternal conn = self._connection_for_bind(bind) File "C:\projects\todos\venv\lib\site-packages\sqlalchemy\orm\session.py", line 2001, in connectionfor_bind return trans._connection_for_bind(engine, execution_options) File "<string>", line 2, in connectionfor_bind File "C:\projects\todos\venv\lib\site-packages\sqlalchemy\orm\state_changes.py", line 139, in _go ret_value = fn(self, arg, *kw) File "C:\projects\todos\venv\lib\site-packages\sqlalchemy\orm\session.py", line 1126, in connectionfor_bind conn = bind.connect() File "C:\projects\todos\venv\lib\site-packages\sqlalchemy\engine\base.py", line 3264, in connect return self._connection_cls(self) File "C:\projects\todos\venv\lib\site-packages\sqlalchemy\engine\base.py", line 145, in init self._dbapi_connection = engine.raw_connection() File "C:\projects\todos\venv\lib\site-packages\sqlalchemy\engine\base.py", line 3288, in raw_connection return self.pool.connect() File "C:\projects\todos\venv\lib\site-packages\sqlalchemy\pool\base.py", line 452, in connect return ConnectionFairy.checkout(self) File "C:\projects\todos\venv\lib\site-packages\sqlalchemy\pool\base.py", line 1267, in _checkout fairy = _ConnectionRecord.checkout(pool) File "C:\projects\todos\venv\lib\site-packages\sqlalchemy\pool\base.py", line 716, in checkout rec = pool._do_get() File "C:\projects\todos\venv\lib\site-packages\sqlalchemy\pool\impl.py", line 169, in doget with util.safe_reraise(): File "C:\projects\todos\venv\lib\site-packages\sqlalchemy\util\langhelpers.py", line 147, in exit raise exc_value.with_traceback(exc_tb) File "C:\projects\todos\venv\lib\site-packages\sqlalchemy\pool\impl.py", line 167, in doget return self._create_connection() File "C:\projects\todos\venv\lib\site-packages\sqlalchemy\pool\base.py", line 393, in createconnection return _ConnectionRecord(self) File "C:\projects\todos\venv\lib\site-packages\sqlalchemy\pool\base.py", line 678, in init self.__connect() File "C:\projects\todos\venv\lib\site-packages\sqlalchemy\pool\base.py", line 902, in __connect with util.safe_reraise(): File "C:\projects\todos\venv\lib\site-packages\sqlalchemy\util\langhelpers.py", line 147, in exit raise exc_value.with_traceback(exc_tb) File "C:\projects\todos\venv\lib\site-packages\sqlalchemy\pool\base.py", line 898, in __connect self.dbapi_connection = connection = pool._invoke_creator(self) File "C:\projects\todos\venv\lib\site-packages\sqlalchemy\engine\create.py", line 637, in connect return dialect.connect(*cargs, **cparams) File "C:\projects\todos\venv\lib\site-packages\sqlalchemy\engine\default.py", line 615, in connect return self.loaded_dbapi.connect(*cargs, **cparams) File "C:\projects\todos\venv\lib\site-packages\pymysql\connections.py", line 358, in init self.connect() File "C:\projects\todos\venv\lib\site-packages\pymysql\connections.py", line 664, in connect self._request_authentication() File "C:\projects\todos\venv\lib\site-packages\pymysql\connections.py", line 976, in requestauthentication auth_packet = auth.cachingsha2_password_auth(self, auth_packet) File "C:\projects\todos\venv\lib\site-packages\pymysql\_auth.py", line 266, in caching_sha2_password_auth data = sha2_rsa_encrypt(conn.password, conn.salt, conn.server_public_key) File "C:\projects\todos\venv\lib\site-packages\pymysql\_auth.py", line 143, in sha2_rsa_encrypt raise RuntimeError(RuntimeError: 'cryptography' package is required for sha256_password or caching_sha2_password auth methods
-
해결됨실전! FastAPI 입문
강좌의 풀 코드가 github에 공개된게 없나요?
-학습을 하다가 중간 중간 막히는 곳이 있어.. 코드의 뭐가 잘못되었는지 확인하려는데..강의를 뒤로 돌아가서 영상으로 확인하려면 어렵습니다..강좌의 풀 코드가 github에 공개된게 없나요?
-
미해결파이썬 동시성 프로그래밍 : 데이터 수집부터 웹 개발까지 (feat. FastAPI)
파이썬 코루틴활용 영상 질문
코드를 실행해보니까 naver쪽 데이터만 불러오는 것같습니다. 속도도 너무 빠르고 뭐가 문제일까요? 그리고 할때마다 시간이 다르네요 ㅠㅠ aiohttp 버전도 3.7.3으로 설치했습니다
-
미해결파이썬 동시성 프로그래밍 : 데이터 수집부터 웹 개발까지 (feat. FastAPI)
가상환경 설정 질문
가상환경 들어가서 pytho hello.py실행해도 파일이 없다고 오류가 뜨네요. 처음에 들어갔을때는 앞에 가상환경 venv가 안떠서 powershell하나더 만드니까 저렇게 앞에 venv가 떴습니다. 이렇게 하는거 맞을까요 그리고 이거랑 무슨 차이인지도 궁금합니다.