Giter Site home page Giter Site logo

Comments (3)

rumbarum avatar rumbarum commented on May 22, 2024 1

아무래도 DI의 문제로 보이네요. 현상 한번 파보고 이슈 제보해야 겠네요.

첫 번째 코드를 보면 engine, session_factory등 모든 부분을 Singleton으로 구성하셨는데 따로 이유가 있을까요?

저는 전역 객체들도 import 가 아닌, DI Container로 주입하려고 이렇게 했습니다. 모듈에서 임포트를 DI inject로 대입했다고 보시면 됩니다.
이렇게 했던건 사실 영식님 코드가 시작이었네요 . 코드링크 이 코드가 잘 이해가 안가서 보다가 객체 정의 해논 곳과 객체 초기화 하는 곳이 달라서 이렇게 되었다고 보고 정의와 주입을 한번에 몰아서 하려고 DI 로 통합했습니다.

그래서 아래처럼 컨테이너에 정의해놓고 사용하고 있습니다.

  redis_backend = providers.Factory(RedisBackend)
  redis_key_maker = providers.Factory(CustomKeyMaker)
  redis = providers.Singleton(
      Redis.from_url,
      # this value should be called when declared. If not, repr(config.value) will be injected.
      url=f"redis://{config.REDIS_HOST()}:{config.REDIS_PORT()}",
  )
  cache_manager = providers.Singleton(
      CacheManager, backend=redis_backend, key_maker=redis_key_maker
  )

stand_alone_session이 원래는 fixture 용도 였군요,
메인 로직과 상관없는 DB 접근을 BackgroudTasks에서 하려고 했는데 기존 미들웨어 context가 먼저 remove 되더라구요. 그래서 거기에서 사용하고 있습니다. 생각해보니 테스트에도 사용하긴 했네요.

암튼 영식님 코드가 FastAPI 이해에 아주 많은 도움이 되었고 지금도 계속 참고하고 있습니다!
지금 repo에도 DI 적용하시는것 같은데, 제 적용기도 공유드립니다. 도움 되시면 좋겠네요. 문서링크

from fastapi-boilerplate.

rumbarum avatar rumbarum commented on May 22, 2024

standalone_session 에 들어가는 session을 provider로 찍어내면 기대대로 동작합니다.

standalone_session 의 session과, func 내의 session이 동일합니다.

from .session_maker import reset_session_context, set_session_context

session_factory: Provider[async_scoped_session] = Provide["session.provider"]


def standalone_session(func):
    async def _standalone_session(*args, **kwargs):
        session = session_factory()
        session_id = str(uuid4())
        context = set_session_context(session_id=session_id)
        try:
            result = await func(*args, **kwargs)
            await session.commit()
        except Exception as e:
            await session.rollback()
            raise e
        finally:
            await session.remove()
            reset_session_context(context=context)
        return result

    return _standalone_session

from fastapi-boilerplate.

teamhide avatar teamhide commented on May 22, 2024

@rumbarum 바름님 안녕하세요. 첫 번째 코드를 보면 engine, session_factory등 모든 부분을 Singleton으로 구성하셨는데 따로 이유가 있을까요? 파이썬에서는 모듈 레벨 임포트 시 기본적으로 싱글톤이 보장됩니다. 따라서 DI 라이브러리를 통해 싱글톤으로 선언하지 않아도 된다고 생각해요. 참고 문서

그리고 추가적으로 몇가지 말씀드리자면,

현재 코드의 구성을 보면 session의 context를 미들웨어에서 설정합니다. 하지만 테스트 코드에서 통합 테스트가 아닌 경우 이러한 context를 설정해주는 부분이 없기 때문에 context에 대한 문제가 발생했어요. 그래서 standalone_session 데코레이터를 통해 context를 설정해주는 코드를 작성했었는데요. 이 부분 현재 개선해서 fixture로 빼두었습니다. 코드 여기서 session_context fixture 참고하시면 좋을 것 같습니다.

이러한 context 설정을 통해 비동기 서버에서 SQLAlchemy를 context local로 사용할 수 있는데, 알고 계실지도 모르지만 자세한 내용은 관련 문서 여기서 scoped_session 단락 확인하시면 됩니다.

결론적으로 테스트 코드이던지, 실제 서버 코드이던지 session에 대한 처리를 따로 해주실 필요는 없습니다. 어떠한 곳에서라도 단순히 session을 import해서 사용하는게 목적이었고 그렇게 돌아가도록 작성한 코드라서요. 참고로 현재 전체 코드에 대한 변경사항이 대폭 적용되어 전체 코드를 다시 한번 보시는것도 좋을 것 같네요.

도움이 되면 좋겠네요 :)

from fastapi-boilerplate.

Related Issues (18)

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.