본문 바로가기
파이썬

파이썬 하위 스레드를 시작할 때 플라스크가 '요청 컨텍스트 외부에서 작동'하는 현상

by º기록 2020. 9. 16.
반응형

Flask 응용 프로그램 내부에서 Python에서 새 스레드를 시작하려고합니다. 요청에 의해 트리거되는 백그라운드 작업을 수행하고 있지만 요청에 응답하기 위해 작업이 완료 될 때까지 기다릴 필요가 없습니다.

이 하위 위협의 플라스크 요청을 들어오는 요청으로 설정할 수 있습니까? 이유는 DB에 대한 쿼리에 대한 ACL (mongoDB 앞의 mongoengine)은 요청의 사용자 (플라스크의 요청 객체에서 가져옴)에 의존하여 객체에 대한 액세스 권한이 있는지 확인하고 요청이 하위 스레드에서는 사용할 수 없습니다.

어떤 생각이라도 많이 주시면 감사하겠습니다.

여기에 내가 지금 처리하는 방법에 대한 의사 코드가 있지만 작동하지 않습니다.

@app.route('/my_endpoint', methods=['POST'])
def my_endpoint_handler():
    #do tracking in sub-thread so we don't hold up the page
    def handle_sub_view(req):
        from flask import request
        request = req
        # Do Expensive work
    thread.start_new_thread(handle_sub_view, (request))
    return "Thanks"

 

해결 방법

 


@app.route('/my_endpoint', methods=['POST'])
def my_endpoint_handler():
    #do tracking in sub-thread so we don't hold up the page
    def handle_sub_view(req):
        with app.test_request_context():
            from flask import request
            request = req
            # Do Expensive work
    thread.start_new_thread(handle_sub_view, (request))
    return "Thanks"

수정 : 대화 목록의 컨텍스트가 원래 요청과 다르다는 점을 지적하는 것이 좋습니다. 스레드를 생성하기 전에 사용자 ID와 같은 흥미로운 요청 데이터를 추출해야합니다. 그런 다음 ID를 사용하여 하위 스레드에서 (다른) 사용자 개체를 가져올 수 있습니다.

 

참조 페이지 https://stackoverflow.com/questions/9931738

 

 

반응형

댓글