묻고 답해요
141만명의 커뮤니티!! 함께 토론해봐요.
인프런 TOP Writers
-
미해결실전! FastAPI 입문
파이참 임포트 문제
안녕하세요. fastapi를 사용해서 서버를 개발하고있는데, 한가지 불편한것이 있어서 여쭤보려고 합니다. 다름이 아니라 외부에 작성해놓은 함수를 import 할 때 생기는 문제인데요.project| - src| - | - api| - | - extension| - | - exception| - | - main.py이렇게 프로젝트 트리가 구성되어 있다고 했을때, project 경로에서 uvicorn src.main:app 으로 서버를 실행하면 ModuleNotFoundError: No module named 'extension' 이런 에러가 발생합니다. 이게 import 를 할 때 src.from extension.~ import ~ 이렇게 되어있지 않고 import 할 때, 자동으로 from extension.~ import ~ 이렇게 import가 되어서 모듈을 찾지 못해 발생하는 에러인 것 같은데요.혹시 자동으로 임포트 할 때부터 src.from extension.~ import ~ 이렇게 소스루트부터 import 하게 하는 설정이 따로 있을까요? 하나하나 적어주기가 너무 불편해서 여쭤봅니다 ㅠ
-
해결됨실전! FastAPI 입문
INFO sqlalchemy.engine.Engine ROLLBACK
swagger 로 opt 생성, 검증 api 실행을 했더니 sqlalchemy.engine.Engine ROLLBACK 로그가 출력이 됩니다. 원인을 모르겠습니다...로그INFO: Application startup complete. INFO: 127.0.0.1:63654 - "GET /docs HTTP/1.1" 200 OK email-validator not installed, email fields will be treated as str. To install, run: pip install email-validator INFO: 127.0.0.1:63654 - "GET /openapi.json HTTP/1.1" 200 OK 2024-10-31 14:25:27,367 INFO sqlalchemy.engine.Engine SELECT DATABASE() 2024-10-31 14:25:27,367 INFO sqlalchemy.engine.Engine [raw sql] {} 2024-10-31 14:25:27,369 INFO sqlalchemy.engine.Engine SELECT @@sql_mode 2024-10-31 14:25:27,369 INFO sqlalchemy.engine.Engine [raw sql] {} 2024-10-31 14:25:27,369 INFO sqlalchemy.engine.Engine SELECT @@lower_case_table_names 2024-10-31 14:25:27,370 INFO sqlalchemy.engine.Engine [raw sql] {} 2024-10-31 14:25:27,372 INFO sqlalchemy.engine.Engine BEGIN (implicit) 2024-10-31 14:25:27,377 INFO sqlalchemy.engine.Engine SELECT user.id, user.username, user.password, todo_1.id AS id_1, todo_1.contents, todo_1.is_done, todo_1.user_id FROM user LEFT OUTER JOIN todo AS todo_1 ON user.id = todo_1.user_id WHERE user.username = %(username_1)s 2024-10-31 14:25:27,377 INFO sqlalchemy.engine.Engine [generated in 0.00018s] {'username_1': 'admin'} INFO: 127.0.0.1:63658 - "POST /users/log-in HTTP/1.1" 200 OK 2024-10-31 14:25:27,603 INFO sqlalchemy.engine.Engine ROLLBACK INFO: 127.0.0.1:63664 - "POST /users/email/otp HTTP/1.1" 200 OK 2024-10-31 14:26:02,514 INFO sqlalchemy.engine.Engine BEGIN (implicit) 2024-10-31 14:26:02,514 INFO sqlalchemy.engine.Engine SELECT user.id, user.username, user.password, todo_1.id AS id_1, todo_1.contents, todo_1.is_done, todo_1.user_id FROM user LEFT OUTER JOIN todo AS todo_1 ON user.id = todo_1.user_id WHERE user.username = %(username_1)s 2024-10-31 14:26:02,514 INFO sqlalchemy.engine.Engine [cached since 35.14s ago] {'username_1': 'admin'} INFO: 127.0.0.1:63671 - "POST /users/email/verify HTTP/1.1" 200 OK Sending email to admin@fastapi.com! 2024-10-31 14:26:12,519 INFO sqlalchemy.engine.Engine ROLLBACK src/database/repository.pyfrom typing import List, Optional from fastapi import Depends from sqlalchemy import select, delete from sqlalchemy.orm import Session from database.connection import get_db from database.orm import ToDo, User class ToDoRepository: def __init__(self, session: Session = Depends(get_db)): self.session = session def get_todos(self) -> List[ToDo]: return list(self.session.scalars(select(ToDo))) def get_todo_by_todo_id(self, todo_id: int) -> ToDo | None: return self.session.scalar(select(ToDo).where(ToDo.id == todo_id)) def create_todo(self, todo: ToDo) -> ToDo: self.session.add(instance=todo) self.session.commit() self.session.refresh(instance=todo) return todo def update_todo(self, todo: ToDo) -> ToDo: self.session.add(instance=todo) self.session.commit() self.session.refresh(instance=todo) return todo def delete_todo(self, todo_id: int) -> None: self.session.execute(delete(ToDo).where(ToDo.id == todo_id)) self.session.commit() class UserRepository: def __init__(self, session: Session = Depends(get_db)): self.session = session def get_user_by_username(self, username: str) -> User | None: return self.session.scalar(select(User).where(User.username == username)) def save_user(self, user: User) -> User: self.session.add(instance=user) self.session.commit() self.session.refresh(instance=user) return user src/service/user.pyimport random import time import bcrypt from datetime import datetime, timedelta from jose import jwt class UserService: encoding: str = "UTF-8" JWT_SECRET_KEY: str = "f002393019e8776398370aa671767b860b702854724591cd0da5fc97bda3daf1" JWT_ALGORITHM: str = "HS256" def hash_password(self, plain_password: str) -> str: hashed_password: bytes = bcrypt.hashpw( plain_password.encode(self.encoding), salt=bcrypt.gensalt() ) return hashed_password.decode(self.encoding) def verify_password( self, plain_password: str, hashed_password: str ) -> bool: return bcrypt.checkpw( plain_password.encode(self.encoding), hashed_password.encode(self.encoding) ) def creat_jwt(self, username: str) -> str: return jwt.encode( { "sub": username, "exp": datetime.now() + timedelta(days=1), }, self.JWT_SECRET_KEY, algorithm=self.JWT_ALGORITHM ) def decode_jwt(self, access_token: str) -> str: payload: dict = jwt.decode( access_token, self.JWT_SECRET_KEY, algorithms=[self.JWT_ALGORITHM] ) return payload["sub"] @staticmethod def create_otp() -> int: return random.randint(1000, 9999) @staticmethod def send_email_to_user(email: str) -> None: time.sleep(10) print(f"Sending email to {email}!") src/api/user.pyfrom fastapi import APIRouter, Depends, HTTPException, BackgroundTasks from cache import redis_client from database.orm import User from database.repository import UserRepository from schema.request import SignUpRequest, LoginRequest, CreateOTPRequest, VerifyOTPRequest from schema.response import UserSchema, JWTResponse from security import get_access_token from service.user import UserService router = APIRouter(prefix="/users", tags=["USER"]) @router.post("/sign-up", status_code=201) def user_sign_up_handler( request: SignUpRequest, user_service: UserService = Depends(), user_repository: UserRepository = Depends(), ): hashed_password: str = user_service.hash_password( plain_password=request.password ) user: User = User.create( username=request.username, hashed_password=hashed_password ) user: User = user_repository.save_user(user) return UserSchema.from_orm(user) @router.post("/log-in", status_code=200) def user_log_in_handler( request: LoginRequest, user_service: UserService = Depends(), user_repository: UserRepository = Depends(), ): user: User | None = user_repository.get_user_by_username( username=request.username ) if not user: raise HTTPException(status_code=404, detail="User Not Found") verified: bool = user_service.verify_password( plain_password=request.password, hashed_password=user.password ) if not verified: raise HTTPException(status_code=401, detail="Not Authorized") access_token: str = user_service.creat_jwt(username=user.username) return JWTResponse(access_token=access_token) @router.post("/email/otp") def create_otp_handler( request: CreateOTPRequest, _: str = Depends(get_access_token), user_service: UserService = Depends() ): otp: int = user_service.create_otp() redis_client.set(request.email, otp) redis_client.expire(request.email, 3 * 60) return {"otp": otp} @router.post("/email/verify") def verify_otp_handler( request: VerifyOTPRequest, background_tasks: BackgroundTasks, access_token: str = Depends(get_access_token), user_service: UserService = Depends(), user_repo: UserRepository = Depends(), ): otp: str | None = redis_client.get(request.email) if not otp: raise HTTPException(status_code=400, detail="Bad Request") if request.otp != int(otp): raise HTTPException(status_code=400, detail="Bad Request") username: str = user_service.decode_jwt(access_token=access_token) user: User | None = user_repo.get_user_by_username(username) if not user: raise HTTPException(status_code=404, detail="User Not Found") background_tasks.add_task( user_service.send_email_to_user, email="admin@fastapi.com" ) return UserSchema.from_orm(user)
-
해결됨실전! FastAPI 입문
FastAPI 오류
안녕하세요. 강의를 듣고 혼자 프로젝트 해보고있는데 왜인지 원인을 모르겠는 오류가 생겨서 여쭤봅니다.프로젝트를 uvicorn main:app --reload 명령어로 실행하면 무수히많은 에러 스택과 함께 아래와 같은 에러가 발생하는데요.pydantic.errors.PydanticUndefinedAnnotation: name 'Optional' is not definedPydantic에서 에러가 나는 것 같은데, 저는 Optional을 사용하지 않고, None으로 사용하고 있는데 있는데 왜 이러는걸까요?
-
해결됨실전! FastAPI 입문
get_todos_handler 부분 쿼리 매개변수 인식 오류
from fastapi import FastAPI 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") def get_todos_handler(order: str | None = None): ret = list(todo_data.values()) if order and order == 'DESC': return ret[::-1] return ret위와 같이 강사님 코드 그대로 실행하고, 패키지 버전도 FastAPI==0.97.0인데, 쿼리 매개변수가 인식이 안되는데, 무슨 문제일까요?
-
미해결실전! Django 활용
urls.py 파일에 작성한 코드 분리 여부
안녕하세요. 정말 강의 재밌게 잘 듣고 있습니다.들으면서 궁금한 부분이 있어 질문드립니다./orders API를 예시로 들었을 때, urls.py 파일에 모든 코드가 작성되는데, 쿼리나 비즈니스 로직을 따로 분리하는 방식은 파이썬 프레임워크에서는 잘 사용하지 않는 방법인가요? 일반적으로 스프링에서는 service와 respository 클래스로 해당 코드를 분리하는 편이어서 이 차이점이 궁금합니다.
-
미해결[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part8: Entity Framework Core
UDF 를 구현 할때 Annotation 방식만으로는 예외처리 당합니다
UDF 를 구현 할때 2가지 방법이 있는 것으로 소개 해주셔서테스트 삼아 Fluent Api 방식의builder.HasDbFunction(() => Program.GetAverageReviewScore(0));를 주석 처리 하고Annotation 방식의[DbFunction()]구절만 남겨서 진행을 했는데GetAverageReviewScore 함수에서 예외처리가 되며 실행이 막히네요Annotation 방식으로 UDF 를 구현하기 위해선 추가적인 내용이 필요한 것일까요?
-
해결됨파이썬 API 마스터! FastAPI
강의 소스 코드
안녕하세요 강의 잘 듣고 있는데요~소스코드 자료 부탁드려도 될까요?runiarang21@naver.com여기로 부탁드리겠습니다. 감사합니다.
-
해결됨파이썬 API 마스터! FastAPI
강사님의 강의 소스코드
강의자료가 pdf외에 보이지 않습니다.강사님이 수업하면서 작성하신 완성 소스코드를 받고싶은데 어디서 받을 수 있을까요?
-
해결됨실전! Django 활용
pg_bigm으로 product의 name필드로 상품 검색
안녕하세요, 강의 아주 재밌게 듣고 있습니다! 정말 필요한 강의 제공해주셔서 감사드립니다. 이번에 상품 검색 - 한글 full-text search를 듣고 궁금한게 생겨 질문 남깁니다.이전 강의에서는 tags에 영문 데이터를 추가하여, search_vector과 역인덱스를 생성하여 상품을 검색했을때는 tags가 변경되었을 때, search_vector과 역인덱스도 수정해주는 코드를 마이그레이션에 추가하셨는데요. name에는 따로 그런 코드를 작성하지 않아서, name도 수정될 때 역인덱스가 수정되는지 궁금합니다.
-
해결됨실전! Django 활용
product의 name 필드로 상품 검색시 생성한 gin index사용 여부
안녕하세요 강사님!상품검색 - 한글 full-text search 구현 부분 듣다가 궁금한 점이 생겨 질문 남깁니다.product_list_handler에서 query가 있을 때, products를 필터하는 orm에서 100개로 갯수를 제한하는데요.강의에서처럼 explain으로 쿼리 실행계획을 볼 때, 데이터가 얼마 없을때는 full scan을 하고, 많으면 모델에서 생성한 'product_name_gin_index'를 통해 scan을 하더라구요.언제부터 인덱스에서 스캔하나 궁금해서 limit를 늘려가면서 확인했는데, 제 로컬에서는 limit가 12,800개가 넘어갈 때 인덱스를 사용하더라구요. 이렇게 되면 100개로 제한해서 쿼리하면 어차피 인덱스를 사용하지 않을것 같은데 맞나요?맞다면 결과적으로 product_name_gin_index 인덱스를 사용하지 않는데, 이 인덱스를 생성한게 의미가 있을까요?? 응답할 때 페이지네이션을 필요하니까 한번에 10,000개 이상 보낼 일은 없을 것 같은데 인덱스를 생성한 장점이 있는지 궁금합니다!def product_list_handler( request: HttpRequest, category_id: int | None = None, query: str | None = None ): """ 쿼리 파라미터인 category_id, query에 따라 상품 목록 조회 API """ if query: products = Product.objects.filter( name__contains=query, status=ProductStatus.ACTIVE )[:100] ... (생략) pass
-
해결됨실전! FastAPI 입문
테스트 코드 path api 에서 오류에대해 해결해주세요
def test_update_todo(client, mocker): # 200 # mocker.patch( # "main.get_todo_by_todo_id", # return_value=ToDo(id=1, contents="todo", is_done=True) # ) # undone = mocker.patch.object(ToDo, "undone") # mocker.patch( # "main.update_todo", # return_value=ToDo(id=1, contents="todo", is_done=False) # ) # # response = client.patch("/todos/1", json={"is_done": False}) # undone.assert_called_once_with() # # assert response.status_code == 200 # assert response.json() == {"id": 1, "contents": "todo", "is_done": True} # 가상 DB 생성 mocker.patch( "main.get_todo_by_todo_id", return_value=None ) # 404 # update response = client.patch("/todos/1", json={"is_done": True}) assert response.status_code == 404 assert response.json() == {"detail": "ToDo Not Found"} 여기에서 422 에러가 매칭 안된다고 나옵니다. main.py 코드는 @app.patch("/todos/{todo_id}", status_code=200) def update_todo_handler( todo_id: int, is_done: bool, 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 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") 이러합니다. 똑같이 한상태이고 혹시 스키마 부분이 from_attributes = True 이걸 써서 그런겉가요?
-
해결됨실전! FastAPI 입문
pytest 세팅 강좌 / cache 파일이 생성되지 않습니다.
pytest 명령어 입력 후 1 passed, 1 warning이 뜹니다. src파일 밑에 pytest_cache 파일 또한 생성되지 않습니다. 어떻게 하면 될까요?*검색을 해봤는데 httpx의 버전 문제인 것 같기도 하나,,자력으로 해결이 안됩니다,..
-
해결됨파이썬 API 마스터! FastAPI
깃허브 레포지토리로 버전관리하기
안녕하세요. 덕분에 fastapi를 쉽게 배우는 중입니다. ㅎㅎ다름아니라 깃허브 레포 생성해서 올리고 싶은데요. fastapi 개발환경이 익숙치 않아서 문제를 겪고 있습니다. (예를들면 git status하니깐 pip로 설치한 라이브러리가 모두 뜬다던지.. 등등입니다. )혹시 간단하게나마로 여기에 깃허브에 올리는 순서를 적어주실수 있으신가요??예를들어)1.어디 폴더위치에 들어간다.2.여기서 무엇을 한다. 리모트 등등3.git push origin feature한다.
-
해결됨실전! FastAPI 입문
session.scalars(select(ToDo))에러
orm.py를 다음과 같이 작성했고 from sqlalchemy import Boolean, Column, Integer, String from sqlalchemy.orm import declarative_base Base = declarative_base() # base란 클래스로 db모델링 class ToDo(Base): __tablename__ = 'todo' # table이름 id = Column(Integer, primary_key=True, index=True) content = Column(String(256), nullable=False) is_done = Column(Boolean, nullable=False) # todo 객체의 출력을 쉽게 보기위해 repr def __repr__(self): return f'<ToDo(id={self.id}, content={self.content})>, is_done={self.is_done}'connection.py도 다음과 같이 작성했으나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) # echo는 쿼리의 처리를 확인 SessionFactory = sessionmaker(autocommit=False, autoflush=False, bind=engine)강의안에서 말씀하신대로 import까지 완료하고명령어 session.scalars(select(ToDo)) 를 실행하는 과정에서 자꾸 이렇게 뜹니다 에러가 한두개가 아니라서 감도 안잡힙니다.. 도와주세요2024-06-06 20:53:23,126 INFO sqlalchemy.engine.Engine SELECT todo.id, todo.content, todo.is_done FROM todo2024-06-06 20:53:23,126 INFO sqlalchemy.engine.Engine [cached since 368.2s ago] {}Traceback (most recent call last): File "C:\Users\yhkim\inflern_project\todos\Lib\site-packages\sqlalchemy\engine\base.py", line 1967, in _exec_single_context self.dialect.do_execute( File "C:\Users\yhkim\inflern_project\todos\Lib\site-packages\sqlalchemy\engine\default.py", line 924, in do_execute cursor.execute(statement, parameters) File "C:\Users\yhkim\inflern_project\todos\Lib\site-packages\pymysql\cursors.py", line 153, in execute result = self._query(query) ^^^^^^^^^^^^^^^^^^ File "C:\Users\yhkim\inflern_project\todos\Lib\site-packages\pymysql\cursors.py", line 322, in _query conn.query(q) File "C:\Users\yhkim\inflern_project\todos\Lib\site-packages\pymysql\connections.py", line 563, in query self._affected_rows = self._read_query_result(unbuffered=unbuffered) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ File "C:\Users\yhkim\inflern_project\todos\Lib\site-packages\pymysql\connections.py", line 825, in _read_query_result result.read() File "C:\Users\yhkim\inflern_project\todos\Lib\site-packages\pymysql\connections.py", line 1199, in read first_packet = self.connection._read_packet() ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ File "C:\Users\yhkim\inflern_project\todos\Lib\site-packages\pymysql\connections.py", line 775, in _read_packet packet.raise_for_error() File "C:\Users\yhkim\inflern_project\todos\Lib\site-packages\pymysql\protocol.py", line 219, in raise_for_error err.raise_mysql_exception(self._data) File "C:\Users\yhkim\inflern_project\todos\Lib\site-packages\pymysql\err.py", line 150, in raise_mysql_exception raise errorclass(errno, errval)pymysql.err.OperationalError: (1054, "Unknown column 'todo.content' in 'field list'")The above exception was the direct cause of the following exception:Traceback (most recent call last): File "C:\Program Files\JetBrains\PyCharm 2024.1.2\plugins\python\helpers\pydev\pydevconsole.py", line 364, in runcode coro = func() ^^^^^^ File "<input>", line 1, in <module> File "C:\Users\yhkim\inflern_project\todos\Lib\site-packages\sqlalchemy\orm\session.py", line 2459, in scalars return self._execute_internal( ^^^^^^^^^^^^^^^^^^^^^^^ File "C:\Users\yhkim\inflern_project\todos\Lib\site-packages\sqlalchemy\orm\session.py", line 2236, in _execute_internal result: Result[Any] = compile_state_cls.orm_execute_statement( ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ File "C:\Users\yhkim\inflern_project\todos\Lib\site-packages\sqlalchemy\orm\context.py", line 293, in orm_execute_statement result = conn.execute( ^^^^^^^^^^^^^ File "C:\Users\yhkim\inflern_project\todos\Lib\site-packages\sqlalchemy\engine\base.py", line 1418, in execute return meth( ^^^^^ File "C:\Users\yhkim\inflern_project\todos\Lib\site-packages\sqlalchemy\sql\elements.py", line 515, in _execute_on_connection return connection._execute_clauseelement( ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ File "C:\Users\yhkim\inflern_project\todos\Lib\site-packages\sqlalchemy\engine\base.py", line 1640, in _execute_clauseelement ret = self._execute_context( ^^^^^^^^^^^^^^^^^^^^^^ File "C:\Users\yhkim\inflern_project\todos\Lib\site-packages\sqlalchemy\engine\base.py", line 1846, in _execute_context return self._exec_single_context( ^^^^^^^^^^^^^^^^^^^^^^^^^^ File "C:\Users\yhkim\inflern_project\todos\Lib\site-packages\sqlalchemy\engine\base.py", line 1986, in _exec_single_context self._handle_dbapi_exception( File "C:\Users\yhkim\inflern_project\todos\Lib\site-packages\sqlalchemy\engine\base.py", line 2353, in _handle_dbapi_exception raise sqlalchemy_exception.with_traceback(exc_info[2]) from e File "C:\Users\yhkim\inflern_project\todos\Lib\site-packages\sqlalchemy\engine\base.py", line 1967, in _exec_single_context self.dialect.do_execute( File "C:\Users\yhkim\inflern_project\todos\Lib\site-packages\sqlalchemy\engine\default.py", line 924, in do_execute cursor.execute(statement, parameters) File "C:\Users\yhkim\inflern_project\todos\Lib\site-packages\pymysql\cursors.py", line 153, in execute result = self._query(query) ^^^^^^^^^^^^^^^^^^ File "C:\Users\yhkim\inflern_project\todos\Lib\site-packages\pymysql\cursors.py", line 322, in _query conn.query(q) File "C:\Users\yhkim\inflern_project\todos\Lib\site-packages\pymysql\connections.py", line 563, in query self._affected_rows = self._read_query_result(unbuffered=unbuffered) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ File "C:\Users\yhkim\inflern_project\todos\Lib\site-packages\pymysql\connections.py", line 825, in _read_query_result result.read() File "C:\Users\yhkim\inflern_project\todos\Lib\site-packages\pymysql\connections.py", line 1199, in read first_packet = self.connection._read_packet() ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
-
해결됨실전! FastAPI 입문
갑자기 웹페이지 수정사항이 적용되질 않습니다.
from fastapi import FastAPI, Body from pydantic import BaseModel # 쉽게 requestbody(입력받는 함수인자) 처리 app = FastAPI() # 앱이란 객체에 api연결해서 서버를 띄우면 HTTP요청 보낼 수 있다. @app.get("/") def health_check_handler(): return {"ping": "pong"} todo_data = { 1: { "id": 1, "contests": "실전! FastAPI 섹션 0 수강", "is_done": False, }, 2: { "id": 2, "contests": "실전! FastAPI 섹션 1 수강", "is_done": False, }, 3: { "id": 3, "contests": "실전! FastAPI 섹션 2 수강", "is_done": False, } } @app.get("/todos") def get_todos_handler(order: str | None = None): ret = list(todo_data.values()) if order and order == "DESC": return ret[::-1] return ret @app.get("/todos/{todo_id}") def get_todo_handler(todo_id: int): return todo_data.get(todo_id, {}) class CreateTodoRequest(BaseModel): id: int contests: str is_done: bool @app.post("/todos") def create_todo_handler(request: CreateTodoRequest): todo_data[request.id] = request.dict() return todo_data[request.id] @app.patch("/todos/{todo_id}") 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 return {}해당 코드까지 진행했고, (todos) PS C:\Users\yhkim\inflern_project\todos\src> uvicorn main:app --reload로 실행했는데 어느순간부터 웹페이지가 수정사항이 적용되지 않습니다.
-
해결됨실전! Django 활용
python manage.py showmigrations 문제
안녕하세요.실습 진행 중에 처음부터 잘 안돼서 메세지 드립니다. python magage.py showmigration 하고 migrate 후에 sqllite 파일 삭제했습니다.다시 prostresql 도커 적용하고 그 후부터 에러가 나네요.python manage.py showmigrationsadmin[X] 0001_initial[X] 0002_logentry_remove_auto_add[X] 0003_logentry_add_action_flag_choicesauth[X] 0001_initial[X] 0002_alter_permission_name_max_length[X] 0003_alter_user_email_max_length[X] 0004_alter_user_username_opts[X] 0005_alter_user_last_login_null[X] 0006_require_contenttypes_0002[X] 0007_alter_validators_add_error_messages[X] 0008_alter_user_username_max_length[X] 0009_alter_user_last_name_max_length[X] 0010_alter_group_name_max_length[X] 0011_update_proxy_permissions[X] 0012_alter_user_first_name_max_lengthcontenttypes[X] 0001_initial[X] 0002_remove_content_type_namesessions[X] 0001_initial어떻게 하면 좋을까요?장고 프로젝트 설치도 해보고 도커도 지워보고 했는데 잘 안돼서 메세지 드립니다. python manage.py makemigrationsno Chages detected python manage.py migrateOperations to perform:Apply all migrations: admin, auth, contenttypes, sessionsRunning migrations:No migrations to apply. 아래의 setting 정보로 database 접속도 잘됩니다.DATABASES = {"default": {"ENGINE": "django.db.backends.postgresql_psycopg2","NAME": "goodpang","USER": "goodpang","PASSWORD": "goodpang","HOST": "127.0.0.1","PORT": "5433",}}
-
해결됨실전! FastAPI 입문
No module named 'sqlalchemy'
sqlalchemy module이 설치되어있음에도 불구하고 위와 같이 서버를 실행시키면 no module named 'sqlalchemy' 라는 오류가 뜨는데 어떻게 해야하나요..+추가로 위의 문제를 해결하기 위해서 시도했던 방법으로,아래와 같이 flask_sqlalchemy를 통해서 sqlalchemy를 불러왔지만from flask_sqlalchemy import SQLAlchemy마찬가지로 flask_sqlalchemy에 대해서도 찾을 수 없다는 오류가 뜹니다..
-
해결됨[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part8: Entity Framework Core
Update By Full 방식에 대하여 질문이 하나 있습니다.
바쁘신 와중에 너무 옛날 강의 가지고 질문드리는 것이 아닌지 너무 죄송스럽습니다. ㅜ 바쁘신 시간 많이 뺏지 않기 위해 후딱 하나만 여쭤볼게요 Update방식에는 Connected상황과 Disconnected상황이 있고, Disconnected 상황에서 처리방식으로 ReLoad와 Full방식이 있다는 것까지는 이해했습니다. 다만 Full방식에 있어서 모든 정보를 넘겨주어야 한다는 말씀을 듣고 제가 제대로 이해한게 맞는지 헷갈리기 시작했습니다. ㅜㅜ 제가 이해한 내용은, 일부 정보만가지고 Full방식의 Update를 시도하면 뭔가 Update가 Fail이 될 것이라 생각했습니다. 그런데, Entity 클래스의 객체를 하나 생성하고 속성값을(Name) 하나만 변경시켜 Update요청을 하였을 때, 특별한 문제없이 Update가 Complete가 됩니다.(다른 속성값들에 대한 정보를 하나도 입력을 안하더라도...) 궂이 모든 정보를 넘겨주지 않고 일부 정보만으로도 Full방식의 Update가 되는 이 상황이 정상적인 것이 맞는지, 뭔가 제가 말씀하신 내용의 요지를 잘못 집고 있는 것인지 말씀해주세요.
-
해결됨실전! FastAPI 입문
섹션 테스트 코드 오류..
버전 문제가 아닌 거 같아서 문의 드립니다.. 구글링 해도 안 나와서 질문 드립니다..ㅠㅠ
-
해결됨파이썬 API 마스터! FastAPI
async, await 질문
안녕하세요.비동기처리 관련하여 질문드립니다.async 키워드가 비동기로 처리하기 위한 함수의 선언이고 실제 비동기 처리가 이루어져야 하는 부분은 await 키워드를 붙여주는데 여기서 await 설명해주실 때 헷갈리는 부분이 있어서요. 비동기는 코드를 순차적으로 기다리지 않고 작업이 완료되지 않아도 그 다음 코드를 실행하는 방식이고, 여기서 await 키워드는 해당 작업이 끝나는 걸 기다리게 하는 키워드로 알고 있는데 설명해 주실 때 해당 함수가 끝날 때까지 현재 함수를 일시 정지한다.고 하셨는데 여기서 해당 함수는 뭐고 현재 함수는 뭘 말하는 건가요 ? 해당 함수는 await 키워드가 붙은 작업을 의미하고 현재 함수는 이 await 작업을 포함하고 있는 함수를 의미 하나요 ? 그리고 만약 이게 맞다면 await 키워드가 붙은 작업이 실행되는 동안 그 작업이 포함된 함수가 아닌 다른 작업들은 수행이 되는 거죠 ? (쓰레드가 따로 생성되서 처리되는 걸로 아는데 이게 맞는건지 ...)자바스크립트 쪽에서 async / await 관련된 설명들을 좀 보면 await 키워드를 쓰면 비동기가 강제적으로 동기 처리가 되어 코드가 순차적으로 수행된다고 표현하는 글들이 종종 있던데 fast api 에서도 같은 개념인가요 ? 비동기 처리를 위해 작성한 코드인데 강제 동기 처리가 된다는 게 이해가 안갑니다.감사합니다.