목록 보기
for 루프에서 transaction.on_commit을 사용할 때 콜백 함수에 인자를 올바르게 넘기는 방법
백엔드

for 루프에서 transaction.on_commit을 사용할 때 콜백 함수에 인자를 올바르게 넘기는 방법

8퍼센트
8퍼센트
2020년 10월 26일

두줄요약

Django `transaction.on_commit` 콜백에서 루프 변수 지연 평가로 마지막 사용자만 반복 처리되는 원인을 설명했습니다. 람다 기본 인자로 현재 값을 고정해 각 사용자에게 알림을 보내는 방법을 소개합니다.

문제 상황

  • Django transaction.on_commit과 for 루프 조합에서 당첨자별 알림 발송 필요
  • lambda send_notification(user) 등록 시 마지막 사용자에게만 알림 반복 발송

원인 분석

  • 커밋 이후 콜백 실행 시점에 루프 변수 user를 참조하는 지연 평가 문제
  • on_commit이 별도 인자 없이 호출하는 매개변수 없는 콜백 등록 방식

해결 방법

  • 람다 매개변수의 기본값으로 현재 루프 변수 고정
  • lambda user=user: send_notification(user) 형태로 사용자별 콜백 생성

주의할 점

  • lambda user: send_notification(user)는 필수 인자를 요구하므로 on_commit 콜백으로 사용 불가
  • 루프 내부 비동기·지연 실행 콜백에서 변수 캡처 시점 확인 필요

다음 읽기

#Django 주제를 이어서 읽기

두숟갈 스터디 - 5

Django ORM의 쿼리 작성, 예외 처리, 인덱스와 트랜잭션을 스터디로 정리했습니다. Explain과 ACID 등 데이터베이스 동작 원리를 심화 학습했습니다.

8퍼센트
8퍼센트
백엔드

댓글 0개

댓글을 작성하려면 로그인이 필요합니다.

댓글을 불러오는 중...