Comments (3)
아무래도 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.
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.
@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)
- 비밀번호 암호화 기능 추가 HOT 2
- [Question]: What is difference between local and dev environments HOT 4
- Could you also add basic setup for pytest? HOT 9
- Could you describe some more basic informations in README.md? HOT 2
- 프로젝트 구성에 대한 질문 HOT 1
- What does Propagation for Transactional do? HOT 3
- Code revision HOT 1
- Config file not working? HOT 2
- What is the best practice for using this? HOT 1
- What is the config for postgres ? HOT 1
- Benchmarking strategy is wrong here.... HOT 1
- How get currentUser HOT 1
- Can't open files in static folder HOT 1
- AttributeError: 'str' object has no attribute 'decode' HOT 3
- 프로젝트 스켈레톤에 대한 질문 HOT 2
- Response Model에 대한 질문 HOT 4
- What is the appropriate way to log? HOT 1
Recommend Projects
-
React
A declarative, efficient, and flexible JavaScript library for building user interfaces.
-
Vue.js
🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
-
Typescript
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
-
TensorFlow
An Open Source Machine Learning Framework for Everyone
-
Django
The Web framework for perfectionists with deadlines.
-
Laravel
A PHP framework for web artisans
-
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.
-
Visualization
Some thing interesting about visualization, use data art
-
Game
Some thing interesting about game, make everyone happy.
Recommend Org
-
Facebook
We are working to build community through open source technology. NB: members must have two-factor auth.
-
Microsoft
Open source projects and samples from Microsoft.
-
Google
Google ❤️ Open Source for everyone.
-
Alibaba
Alibaba Open Source for everyone
-
D3
Data-Driven Documents codes.
-
Tencent
China tencent open source team.
from fastapi-boilerplate.