Flask를 사용하는 개발자라면 한 번쯤 마주하게 되는 'RuntimeError: Working outside of request context' 오류. 이 오류는 초보 개발자부터 경험 많은 개발자까지 모두를 당혹스럽게 만듭니다. 오늘은 이 오류의 원인과 해결 방법에 대해 자세히 알아보겠습니다.
오류의 원인: 요청 컨텍스트란 무엇인가?
Flask는 요청 컨텍스트(Request Context)라는 개념을 사용합니다. 요청 컨텍스트는 HTTP 요청이 들어올 때 생성되고, 그 요청의 처리가 완료되면 사라집니다. request, session 같은 Flask의 글로벌 객체들은 이 컨텍스트 내에서만 유효하게 작동합니다.
'Working outside of request context' 오류는 이름 그대로 요청 컨텍스트가 없는 상황에서 컨텍스트에 의존하는 객체나 함수를 사용하려 할 때 발생합니다. 대표적인 상황들은 다음과 같습니다:
- 앱 초기화 단계에서
request객체 사용 - 백그라운드 작업이나 스케줄러에서 Flask 요청 관련 기능 사용
- 테스트 코드에서 적절한 컨텍스트 설정 없이 요청 관련 기능 호출
해결 방법 1: 요청 컨텍스트 생성하기
가장 직접적인 해결 방법은 요청 컨텍스트를 직접 생성하는 것입니다. Flask에서는 app.test_request_context()와 app.request_context() 메소드를 제공합니다.
from flask import Flask, request
app = Flask(__name__)
# 잘못된 방식 - 오류 발생
# print(request.url) # RuntimeError 발생
# 올바른 방식 - 컨텍스트 생성 후 사용
with app.test_request_context('/some-path?param=value'):
print(request.path) # '/some-path' 출력
print(request.args.get('param')) # 'value' 출력
해결 방법 2: 함수 구조 변경하기
코드 구조를 변경하여 요청 컨텍스트가 필요한 로직은 라우트 핸들러 내부로 이동시키는 방법이 있습니다.
# 잘못된 방식
def get_user_data():
user_id = request.args.get('user_id') # 오류 발생!
return fetch_user(user_id)
@app.route('/user')
def user_route():
return get_user_data()
# 올바른 방식
def fetch_user(user_id):
# request 사용하지 않는 로직
return db.query.get(user_id)
@app.route('/user')
def user_route():
user_id = request.args.get('user_id')
return fetch_user(user_id)
해결 방법 3: 애플리케이션 컨텍스트 활용하기
일부 Flask 기능은 요청 컨텍스트 대신 애플리케이션 컨텍스트만 필요합니다. current_app이나 g 객체 접근 시에는 app.app_context()를 사용할 수 있습니다.
from flask import Flask, g, current_app
app = Flask(__name__)
def configure_app():
with app.app_context():
g.config_loaded = True
print(current_app.name) # 애플리케이션 이름 출력
해결 방법 4: Flask-Login 관련 문제 해결
Flask-Login 사용 시 current_user에 접근할 때도 이 오류가 자주 발생합니다. 이 경우 가짜 요청 컨텍스트를 생성하거나, 대안 함수를 작성해야 합니다.
from flask_login import current_user
def get_current_username():
try:
return current_user.username
except RuntimeError:
# 요청 컨텍스트 밖에서 호출된 경우 대체 로직
return None
요약: 컨텍스트 이해가 핵심
Flask의 'Working outside of request context' 오류는 요청 컨텍스트에 대한 이해 부족에서 비롯됩니다. 이 오류를 방지하려면:
- 요청 컨텍스트가 필요한 코드와 그렇지 않은 코드를 명확히 구분
- 필요한 곳에 적절한 컨텍스트 제공 (
test_request_context(),app_context()) - 백그라운드 작업이나 초기화 코드에서는 직접 인자 전달 방식 사용
Flask 웹 프레임워크의 컨텍스트 개념을 이해하면 이 오류를 효과적으로 해결하고 더 견고한 애플리케이션을 구축할 수 있습니다.
댓글
댓글 쓰기