강의 너무 잘보고 있습니다 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 코드를 바꾼다면 어떻게 바꿔야할까요?
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, async, await)
설명을 잘 해주셔서 이해가 잘 됐습니다. node js 에서는 싱글 스레드로 돌아가고 있고 , 코드를 작성하게 될때 , async await 를 붙여서 동시성 작업을 많이 하는걸로 알고있습니다. 이는 싱글스레드라 할지라도 엔진상 속도가 잘 나오기 때문에 괜찮다고 들었는데요 python 입장에서는 어떤가요 ??
파이썬 동시성 프로그래밍 : 데이터 수집부터 웹 개발까지 (feat. FastAPI, async, await)
- 학습 관련 질문을 남겨주세요. 상세히 작성하면 더 좋아요! - 먼저 유사한 질문이 있었는지 검색해보세요. - 서로 예의를 지키며 존중하는 문화를 만들어가요. - 잠깐! 인프런 서비스 운영 관련 문의는 1:1 문의하기를 이용해주세요. python :select linter를 입력해도 값이 나오지 않습니다. 왜그럴가요?
파이썬 동시성 프로그래밍 : 데이터 수집부터 웹 개발까지 (feat. FastAPI, async, await)
안녕하세요 수업을 듣고있는 한 사람입니다 ㅎㅎ 너무 잘 듣고있습니다. 수업을 들으면서 궁금한점은 검색과 chat gpt 를 통해서 찾아보고있는데요. 단순 chat gpt 의 결과이지만 코루틴은 주로 I/O 바운드와 고수준 구조화된 네트워크 코드에 사용되며, CPU 바운드 작업에는 적합하지 않을 수 있습니다. CPU 바운드 작업을 비동기적으로 처리하려면 멀티 프로세싱이나 다른 접근 방법을 고려해야 할 수 있습니다. 라고 하더라구요 . 혹시 여기에 대해서는 어떻게 생각하시나요 ?
파이썬 동시성 프로그래밍 : 데이터 수집부터 웹 개발까지 (feat. FastAPI, async, await)
- 학습 관련 질문을 남겨주세요. 상세히 작성하면 더 좋아요! - 먼저 유사한 질문이 있었는지 검색해보세요. - 서로 예의를 지키며 존중하는 문화를 만들어가요. - 잠깐! 인프런 서비스 운영 관련 문의는 1:1 문의하기를 이용해주세요. 안녕하세요, 강의 2:17 부분을 보면서 따라해보고 있는데 아래 부분에서 KeyError가 발생합니다. items = result["items"] 구체적인 에러 메시지는 다음과 같습니다 result 객체의 키값만 조회해보면 items가 정상적으로 존재하고, reult의 타입도 dict 형태로 나오는데 왜 keyerror가 발생하는걸까요..?
안녕하세요 강사님 해당 내용을 아무리 찾아봐도 보편적으로 배포에 관련한 내용들이 로컬 호스트로 접속하는것 또는 aws등의 외부 서버를 통해서 배포하는 방식위주로 설명이되어있는데, uvicorn을 사용해서 저희 실습을 기준으로는 uvicorn main:app --host 0.0.0.0 --port 8000 이런식으로 실행하면 컴퓨터를 켜 놓고있는 동안 외부에서 http://(내 ip주소):8000 이런식으로 접근이 가능하게 하고 싶은데(앞선 방법으론 시도해 봤는데 무한로딩이 뜨더라구요) 이런식의 배포는 불가능한지, 가능하면 어떻게 진행하면되는지 궁금합니다!
질문하실 땐 https:// gist.github.com/ 를 사용하시면 코드를 쉽게 공유할 수 있습니다! 원하고자 하는 것 실제 작성한 코드 실행한 결과 원하는 결과 이렇게 4가지를 꼭 적어주셔야 도와드릴 수 있습니다 :) 처음 프로젝트를 실행 후 test.sh 파일을 실행했는데 에러가 두개 발생했습니다. 에러 처리는 어떻게 하나요? 제 에러는 첨부한 사진과 같습니다. 파이썬(3.11.3), poetry(1.4.2) 모두 강의에 나온 버전 설치했습니다.
sqlalchemy.exc.OperationalError: (pymysql.err.OperationalError) (1045, "Access denied for user 'root'@ 'localhos t' (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자체를 없애라길래 없애지 않고 진행하는 방법은 없는건지 의문이 들어서 질문드립니다..!)
(실습) 회원가입 API 구현 강의에서 질문이 있습니다. Depends가 Request 할때마다 객체를 생성하는 것으로 이해하고 있습니다. Depends를 테스트를 위해서 활용하는 것으로 이해했었는데, pyTest를 보면 mock.patch라는 기능으로 DI 없이 목킹을 잘 할 수 있는것으로 보았습니다. UserService를 Depends 처리하면, 요청마다 service를 생성할 것 같은데, 이러면 불필요한 생성과 소멸이 반복될 것 같은데, Depends를 쓰는게 좋을까요? 아니면 싱글톤으로 작성하는게 좋을까요?
파이썬 동시성 프로그래밍 : 데이터 수집부터 웹 개발까지 (feat. FastAPI, async, await)
" 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 강의 수강 중입니다. 섹션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를 해보면 실행중인 컨테이너가 없습니다. 도커를 아예 처음 접하다보니 시작단계에서 어려움이 있는데 도움 부탁드립니다.
pytest 실행하면 FAILED tests/test_main.py::test_get_todos - assert 404 == 200 FAILED tests/test_main.py::test_get_todo - assert 404 == 200 FAILED 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' 라는 오류가 뜹니다...ㅠㅠ
지금 orm적용 get단일 조회 api 강의를 보고있는데 코드를 똑같이 쳤는데 마지막에 swagger 에서 입력 하면 pydantic.error_wrappers.ValidationError: 3 validation errors for ToDoSchema id field required (type=value_error.missing) content field required (type=value_error.missing) is_done field required (type=value_error.missing) 이 오류가 뜹니다..ㅠㅠ 무슨 오류인가요
파이썬 콘솔에서 아래 오류가 발생했어요... 그래서 , pip install cryptography를 했지만 이미 설치되어 있었구요... (todos) C:\projects\todos>pip install cryptography Requirement 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 execute internal conn = self._connection_for_bind(bind) File "C:\projects\todos\venv\lib\site-packages\sqlalchemy\orm\session.py", line 2001, in connection for_bind return trans._connection_for_bind(engine, execution_options) File "<string>", line 2, in connection for_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 connection for_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 do get 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 do get return self._create_connection() File "C:\projects\todos\venv\lib\site-packages\sqlalchemy\pool\base.py", line 393, in create connection 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 request authentication auth_packet = auth.caching sha2_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
안녕하세요. 강의 잘 듣고 있습니다. 데이터베이스 연결 강의에서 파이썬 콘솔에서 from database.connection import SessionFactory를 실행할 때 자꾸 모듈을 찾을 수 없다고 나옵니다. sys.path.append를 통해 경로를 추가해주었는데도 찾지를 못하고 있습니다. 해결방법을 알 수 있을까요? 감사합니다!