flask 의 글로벌 객체 사용 관련.

조회수 6441회

안녕하세요.

"Flask 기반의 파이썬 웹프로그래밍" 이란 책을 보다가 궁금한 점이 생겨서 문의 드립니다.

아래 내용은 책의 일부 입니다.

"글로벌 객체는 애플리케이션 전반에서 공유해야 할 데이터를 저장해두고 사용하는 데 효율적이지만, 글로벌 객체에 저장한 속성에 다수의 동시접근이 이뤄지면 애플리케이션 운용에 문제가 발생할 수 있습니다."

from flask import g

@resource.after_request
def after_request(response):
    # 글로벌 객체를 사용하는 한 예제.
    pritn g.userid

# 기본 Auth Check
def authCheck(func):
    @wraps(func)
    def checkFunc(*args, **kwargs):
        g.userid = 'H2'
        return func(*args, **kwargs)
    return checkFunc

@app.route("/")
@authCheck
def main():
    # 글로벌 객체를 사용하는 또 다른 예제.
    print "hello", g.userid 


위 내용 중, "다수의 동시접근" 이라는 부분이 있는데, 제가 기존에 글러벌 객체 사용을 사용자ID 로 쓰고 있었습니다. (g.userid)

한 세션의 요청을 처리할 때, 어떤 함수에서도 해당 ID 값을 가져다 사용할 수 있도록...

그런데, 위 책의 내용은 저와 같이 사용하면 안된다는 걸까요? 여러 사용자의 요청이 동시에 들어온다면, ID값이 바뀔수 있다는?

그렇다면 큰 문제인데요...

저는 현재 nginx + uwsgi + flask 조합으로 웹 서비스를 운영하고 있습니다.

고수분들의 조언 부탁 드립니다.

그럼 오늘도 좋은 하루 되세요.

  • (•́ ✖ •̀)
    알 수 없는 사용자

1 답변

  • Flask에서 g 객체는 스레드와 각각의 request 내에서만 값이 유효한 스레드 로컬 변수입니다. 사용자의 요청이 동시에 들어오더라도 각각의 request 내에서만 g 객체가 유효하기 때문에 사용자 ID를 저장해도 문제가 없습니다.

    flask.g

    Just store on this whatever you want. For example a database connection or the user that is currently logged in.

    다음 링크의 테스트 코드를 참고해서 테스트를 직접 만드는 것도 의미가 있을 것 같습니다.

    • (•́ ✖ •̀)
      알 수 없는 사용자
    • 답변 감사합니다. 저도 그렇게 알고 사용하고 있었는데, 책을 읽으면서 걱정이 되어서요 ^^. 그럼 오늘도 좋은 하루 되세요~ 알 수 없는 사용자 2016.6.9 09:31

답변을 하려면 로그인이 필요합니다.

프로그래머스 커뮤니티는 개발자들을 위한 Q&A 서비스입니다. 로그인해야 답변을 작성하실 수 있습니다.

(ಠ_ಠ)
(ಠ‿ಠ)