묻고 답해요
131만명의 커뮤니티!! 함께 토론해봐요.
인프런 TOP Writers
-
해결됨실전! 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에 공개된게 없나요?
-
미해결실전! 코틀린과 스프링 부트로 도서관리 애플리케이션 개발하기 (Java 프로젝트 리팩토링)
N + 1 문제 해결 fetch join 관련해서 질문드릴 것이 있습니다!
안녕하세요. 38강의 N + 1 문제를 해결하기 위한 fetch join 문제 해결과 관련해서 제가 발견(?)한 것을 질문드리고자 합니다!수업 내용 중 N + 1 문제를 querydsl을 사용해서 해결하는 것을 보여주셨는데요. 코드가 다음과 같았습니다.class UserRepositoryCustomImpl( private val queryFactory: JPAQueryFactory ) : UserRepositoryCustom { override fun findAllWithHistories(): List<User> { return queryFactory .select(user) .distinct() .from(user) .leftJoin(userLoanHistory).on(userLoanHistory.user.id.eq(user.id)).fetchJoin() .fetch() } }그러고 테스트를 돌렸을 때 쿼리가 찍히는 걸 보면 다음과 같습니다.N + 1 문제가 아직 발생하고 있는 것 같습니다.조금 이상해서 구글링을 해보니 querydsl에서 on 절을 사용하면 두 엔티티가 연관관계라는 것을 인식하지 못 한다고 하네요! 그래서 코드를 다음과 같이 좀 바꿔봤습니다.class UserRepositoryCustomImpl( private val queryFactory: JPAQueryFactory ) : UserRepositoryCustom { override fun findAllWithHistories(): List<User> { return queryFactory .select(user) .distinct() .from(user) .leftJoin(user.userLoanHistories, userLoanHistory).fetchJoin() .fetch() } }이렇게 바꾸고 쿼리를 찍히는 것을 확인하니까한 번에 fetch join 되면서 가져오는 것 같습니다! 한 번 확인해주시면 감사하겠습니다!
-
해결됨실전! FastAPI 입문
ModuleNotFoundError: No module named 'database'
안녕하세요. 강의 잘 듣고 있습니다.데이터베이스 연결 강의에서 파이썬 콘솔에서 from database.connection import SessionFactory를 실행할 때 자꾸 모듈을 찾을 수 없다고 나옵니다.sys.path.append를 통해 경로를 추가해주었는데도 찾지를 못하고 있습니다. 해결방법을 알 수 있을까요? 감사합니다!
-
해결됨실전! FastAPI 입문
혹시 강의처럼 잘 안되시는분들을 위해 글을 남깁니다(09.완강)
안녕하세요 저는 23년 9월 수강 완료한 수강생인데요windows10 환경에서 pycharm 을 이용해 해당 강의 수강하며혹시 저와 같은 이유로 진행이 어려우신 분들을 위해 글을 씁니다 일단 pycharm 버전을 떠나서강의 초반부 윈도우 환경에서 python -m venv todos 로 폴더를 만들고강의와 같이 todos 폴더 안에 src 폴더를 만들면서 source root 를 설정하고 진행시강의 내용처럼 auto import, import 입력시 IDE 에서 도와주는 코드 어시스트 기능을전혀.. 사용할수가 없었습니다. ㅜ(추측컨데 windows 환경이라서 그런건지는 확실치 않지만, venv(가상환경) 내부에 src 를 만들어서 이용하기 때문에 interpreter 충돌이 일어나는게 아닌지.. 싶습니다제 경험으로는 강의 처럼 todos 라는 venv 로 가상환경을 만들고interpreter 세팅을 todos/Script/python.exe 설정을 했을때 온전히 강의처럼 진행이 안됐었습니다.)그래서 해당 사진처럼 cmd에서 venv 명령이 아닌파이참 초반에 open project 할때 new project 를 선택해서위와 같이 설정하고project tree 구조를 위와같이 잡으니 이후 진행이 강의 내용과 똑같이 진행이 되어완강할수 있었습니다. 아마 위와같은 설정으로 new project 하시면 초반에 todos/venv 폴더만 있으실 겁니다 그러면 venv 폴더는 건들지 마시고 todos/src 폴더만 새로이 생성한 후 이후 진행은강의 처럼 똑같이 진행 하시면 되겠습니다.% 강의 후반부 쯤 Redis 를 사용하게 되는데 pycharm 에서 import 하기 전pip install redis 설치해야 그후 부터 python console 에서 redis import 가능합니다 %
-
해결됨실전! FastAPI 입문
pytest시 import error
안녕하세요 선생님! 강의 잘 듣고 있습니다.pytest진행하는 과정에서 똑같이 directory구조 만들고 pytest를 명령어로 입력했더니 ImportError while importing test module: test_main.py 절대경로Hint: make sure your test modules/packages have valid python names.라는 Error와 함께 pytest가 진행되지 않아서 해결책좀 질문드리고 싶습니다 ㅠ. 참고로 SwaggerUI로 API test를 해보면 잘 작동합니다!
-
해결됨실전! FastAPI 입문
ORM적용 POSTAPI 강의
RecursionError: maximum recursion depth exceeded 오류가 발생하네요.찾아보니 너무 많은 라이브러리를 임포트해서 그렇다는데 방법이 없을까요;;
-
해결됨실전! FastAPI 입문
HTT
HTTP Response 처리하는 강의에서 7:53초, response 타입을 -> ~으로 정의하는 부분에서 오류가 발생하내요;; 왜이런지
-
미해결실전! 코틀린과 스프링 부트로 도서관리 애플리케이션 개발하기 (Java 프로젝트 리팩토링)
Class나 Entity 만들 때 접근제어자 관련해서 질문이 있습니다!
자바에서는 Entity나 클래스를 만들 때 접근 제어자로 private을 붙이는게 일반적이었는데요. 코틀린에서는 그렇게 하면 객체를 생성하고도 밖에서 바로 접근이 안 되는 거 같네요ㅠprivate을 붙여주고 custom getter 같은걸로 객체 생성 후 호출하게 해주는 것이 좋은가요? 아니면 접근 제어자를 안 붙이고 그냥 쓰는게 좋은가요..?
-
해결됨실전! FastAPI 입문
섹션2. HTTP Response 처리 에서 from_orm 관련 오류가 나서 질문드립니다.
섹션2. HTTP Response 처리 에서 from_orm 관련 오류가 나서 질문드립니다.The from_orm method is deprecated; set model_config["from_attributes"]=True and use model_validate instead. 라는 에러와 함께 서버를 작동시켜도 Swagger에서 GET함수가 반영되지 않고 status code 500으로 Error가 발생하는데 해결법을 혹시 아실까요? 구글링을 해봐도 정보가 잘 나오지 않네요ㅠif order and order == "DESC": return ListToDoResponse( todos=[ToDoSchema.from_orm(todo) for todo in todos[::-1]] )
-
해결됨실전! FastAPI 입문
파이썬 가상환경 질문
파이썬 가상환경 구축영상에서, 터미널에서 가상환경 구축하셨는데, 어느 터미널에서 실행하는지도 안알려주시고 알려주시면 좋겠습니다. 설명이 너무 빈약하네요...;; 일단 파이참은 설치했는데 어떻게 하는지 자세히 설명 부탁드립니다.
-
해결됨실전! FastAPI 입문
api 데이터 모델링 시, pandantic?
강의를 보고 문서를 보고 정리하는 과정 중에 헷갈리는 점이 있어서 질문 드려봅니다. 저희 코드에서 schema안에 response , request 의 스키마는pydantic의 basemodel로 설계가 되어있고 ,database Orm에는 유저 모델과 todo를 만들었는데, 이 부분은 sql alcemy의 base declaritve를 사용한걸로 기억합니다.(모델 폴더와 스키마 폴더가 헷갈립니다..)백엔드 설계를 할때, 데이터 구조 그리고 erd등 관계도 설정 후에 모델링을 fast api로 할때는 , 저희 강의 때 한 것처럼 orm안에 해준 것처럼 하는 방식일까요? pydantic으로 schema(폴더명 때문에 헷갈리는 부분일 수도.)에서는 단순히 req,res 에 있어서 타입을 검증하기 위한 모델을 설계한 것이라고 보면 될까요? 강의를 듣고, 실제로 백엔드 api 만들어서 프로젝트 구성해보려 하는 과정에서 질문이 있어서 드려봅니다. 1 to many는 아래처럼 하고 , m to m인 경우도 아래 와 비슷한 형식으로 모델링을 하는 걸까요? 강의에서는 맛보기로 간단하게 소개형식이지만 실제로 프로젝트를 한다고 했을땐, 어떻게 작성하는지 궁금합니다.user_id = Column(Integer, ForeignKey("user.id")) Repository 는 mvc의 컨트롤러라고 생각하면 될까요? 모델링 할때, SQLModel로 하는 방법과 강의에서 나온 Base상속방법의 차이는 무엇일까요? 구글링해도 잘 나오지 않네요.. 둘다 상관없다면, 어떠한 것이 선호가 되는지 왜 강의에서는 base상속을 했는지 이유가 있으실까요? SQL Model도 fastapi 저자가 만든 것인고 pydantic기반이라고 들었습니다. 번외로.. 저희가 배운걸로는 declartive 를 상속받는데, 아래와 같은 형식으로도 모델링을 하기도 하나요? from sqlmodel import SQLModel, Field class User(SQLModel, table = True): nickname: str = Field(primary_key = True) password: str
-
해결됨실전! FastAPI 입문
TODO 테스트 코드 작성
저의 경우는 아래와 같이 해주어야 테스트 코드가 통과됩니다. 그 이후는 sql 도커의 데이터가 5개가 있어서 실제는 5개이기 때문이라 생각되어지는데요.강의를 보면서 테스트코드 감을 못잡앗는데, 궁금한 점은 테스트 코드에서 user 변수에다가 id1 이고 test란 이름의 유저네임을 넣어주고 거기다가, todos를 목업으로 2개를 넣어줬는데, 왜 마지막에 assert할때는 user.todos에 넣어준 배열로 하는게 아닌 실제 db들어간 5개의 데이터로 assert로 체크하더라구요. 그러면 아래 mocker patch해준 부분이 제대로 안먹는건가요? 흠..user = User(id=1, username="test", password="hashed") user.todos = [ ToDo(id=1, contents="FastAPI Section 0", is_done=True), ToDo(id=2, contents="FastAPI Section 1", is_done=False), ] mocker.patch.object(UserRepository, "get_user_by_username", return_value=user) def test_get_todos(client, mocker): access_token: str = UserService().create_jwt(username="test") headers = {"Authorization": f"Bearer {access_token}"} user = User(id=1, username="test", password="hashed") user.todos = [ ToDo(id=1, contents="FastAPI Section 0", is_done=True), ToDo(id=2, contents="FastAPI Section 1", is_done=False), ] mocker.patch.object(UserRepository, "get_user_by_username", return_value=user) # order=ASC response = client.get("/todos", headers=headers) assert response.status_code == 200 assert response.json() == { "todos": [ {"id": 1, "contents": "FastAPI Section 0", "is_done": True}, {"id": 2, "contents": "FastAPI Section 0", "is_done": True}, {"id": 3, "contents": "string", "is_done": True}, {"id": 4, "contents": "string", "is_done": True}, {"id": 5, "contents": "string", "is_done": True}, ] } # order=DESC response = client.get("/todos?order=DESC", headers=headers) assert response.status_code == 200 assert response.json() == { "todos": [ {"id": 5, "contents": "string", "is_done": True}, {"id": 4, "contents": "string", "is_done": True}, {"id": 3, "contents": "string", "is_done": True}, {"id": 2, "contents": "FastAPI Section 0", "is_done": True}, {"id": 1, "contents": "FastAPI Section 0", "is_done": True}, ] }
-
해결됨실전! FastAPI 입문
회원가입 test Api Assertion Error
해결완료...user: User = User.create(username=request.username, hashed_password=hashed_password)저 부분에서 username 안하고, positional Arugment처럼User.create(request.username)이런 식으로 코드를 썻네요.. 파이썬에서는 named Argument형식을 맞춰야 하나요? test api user 코드 입니다.def test_user_sign_up(client, mocker): hash_password = mocker.patch.object( UserService, "hash_password", return_value="hashed" ) user_create = mocker.patch.object( User, "create", return_value=User(id=None, username="test", password="hashed") ) mocker.patch.object( UserRepository, "save_user", return_value=User(id=1, username="test", password="hashed"), ) body = {"username": "test", "password": "plain"} response = client.post("/users/sign-up", json=body) hash_password.assert_called_once_with(plain_password="plain") user_create.assert_called_once_with(username="test", hashed_password="hashed") assert response.status_code == 201 assert response.json() == {"id": 1, "username": "test"} 깃 헙 나온 코드로도 해봤지만, 여전히user_create.assert_called_once_with()이 부분에서 에러가 납니다. 주석처리하면 잘 통과 되구요.아래가 에러 메세지 내용이고, 혹시 오타 있을까봐 깃허브 코드 그대로 가져와도 동일하네요.test_users_api.py:5 (test_user_sign_up){'hashed_password': 'hashed'} != {'hashed_password': 'hashed', 'username': 'test'}Expected :{'hashed_password': 'hashed', 'username': 'test'}Actual :{'hashed_password': 'hashed'}expected는 적었떤 username="test"가 나와야 하는데 , 실제는 없나봅니다. 그래서 user_create.assert_called_once_with(hashed_password="hashed") 이런식을 변경하면, 아래처럼 여전히 통과 하지 못하네요 ('test',) != ()Expected :()Actual :('test',)
-
미해결실전! 코틀린과 스프링 부트로 도서관리 애플리케이션 개발하기 (Java 프로젝트 리팩토링)
선생님 19강 UI 테스트 하시는 부분에서 질문이 있습니다.
19강 9분30초 지점에서 책 등록할 때는 400에러가 나면서 책 등록이 안 되는데 왜 그 전에 유저는 바로 정상적으로 등록이 되는걸까요?build.gradle에 implementation 'com.fasterxml.jackson.module:jackson-module-kotlin:2.13.3' 이 디펜던시를 추가해주기 전에도 유저 등록은 정상적으로 되는 이유가 궁금합니다!제가 자바로 개발을 할 때도 웹 계층 DTO에 필드가 한 개만 있을 때는 잭슨이 정상적으로 작동 안 해서 @NoArgConstructor 어노테이션이나 @Setter 등을 꼭 붙여줘야 이게 정상 작동했던 경험이 있습니다. (구글링을 해보니 잭슨 라이브러리 쪽 이슈인데 아직도 open 상태라는 글을 본 거 같기도 합니다..)혹시 UserCreateRequest에는 프로퍼티가 2개 있고, BookRequest에는 프로퍼티가 1개 뿐이라 이런 일이 생긴 것인지도 좀 궁금하네요..
-
미해결실전! 코틀린과 스프링 부트로 도서관리 애플리케이션 개발하기 (Java 프로젝트 리팩토링)
app 실행 시 종료된 프로세스 에러가 발생합니다.
어떻게 해결할 수 있을까요?
-
해결됨실전! FastAPI 입문
DI 주입
현재구조는 todo.py ( controller 역할 ) @router.get("/", status_code=200) def get_todos_handler( order: str | None = None, todo_repo: ToDoRepository = Depends(ToDoRepository), ) -> TodoListSchema: todos: List[ToDo] = todo_repo.get_todos() if order and order == "DESC": return TodoListSchema( todos=[ToDoSchema.from_orm(todo) for todo in todos[::-1]] ) return TodoListSchema( todos=[ToDoSchema.from_orm(todo) for todo in todos] )repository.py ( service 와 repository 역할 ) 로 되어있다면 class ToDoRepository: def __int__(self, session: Session): self.session = session def get_todos(self) -> List[ToDo]: return list(self.session.scalars(select(ToDo)))만약 controller, service , repository 로 구조를 변경한다고 했을때도 controller 에서 부터 todo_repo: ToDoRepository = Depends(ToDoRepository)를 작성해서 service -> repository 까지 끌고와야 할까요 ??
-
해결됨실전! FastAPI 입문
패키지 와 폴더
테스트 코드 까지 강의를 들었습니다.패키지와 폴더의 차이 자세히 이해가 가지 않습니다.패키지로 해도 되고 폴더로 해도되면 모두 패키지 폴더로 생성해도 되지않나 생각이 드는데요어떻게 이해하면 되며 어떤 상황에서 패키지와 폴더를 사용하면 될까요 ??강사님이 패키지를 자주 사용하지 않고 폴더만 을 사용하시다가 패키지는 필요할때만 사용하시는것 같아서 그이유가 있으실까요 ?
-
해결됨실전! FastAPI 입문
update 테스트 코드
update 코드를 @app.patch("/todos/{todo_id}", status_code=status.HTTP_200_OK) def update_todo_handler( todo_id: int, is_done: bool = Body(..., embed=True), session: Session = Depends(get_db), ): todo: ToDo | None = get_todo_by_todo_id(session=session, todo_id=todo_id) if todo: todo.done() if is_done is True else todo.undone() todo: ToDo = update_todo(session=session, todo=todo) return ToDoSchema.from_orm(todo) return HTTPException(status_code=404, detail="Todo not found") 위와 같이 작성하고 난뒤에 , 테스트 코드 200 을 제외한 우선 404 기준으로만 작성했을때# 404 mocker.patch("main.get_todo_by_todo_id", return_value=None) response = client.patch("/todos/1", json={"is_done": True}) assert response.json()['status_code'] == 404 assert response.json()['detail'] == "Todo not found" 다음과 같이 작성했을때 통과가 됐습니다. 하지만 위의 작성된 코드는 영상과 다른 코드입니다.저렇게 정확히 키값을 설정을 해줘야만 통과가 되더라구요.제가 어디를 놓치고 있는걸까요 ?
-
해결됨실전! FastAPI 입문
Django 와 Fast API
머신러닝 이라던지 딥러닝 프로젝트를 서버에 배포하게 될때는 Fast API 를 선호하게 되고 , 백엔드 서버 배포시에는 그럼 Django 를 추천하시나요?