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


안녕하세요.

"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 조합으로 웹 서비스를 운영하고 있습니다.

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

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

  • 2016년 06월 08일에 작성됨
    리눅스 서버 개발자 입니다.

조회수 263


1 답변


좋아요
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     

로그인이 필요한 기능입니다.

Hashcode는 개발자들을 위한 무료 QnA사이트 입니다. 작성한 답변에 다른 개발자들이 댓글을 작성하거나 좋아요/싫어요를 할 수 있기 때문에 계정을 필요로 합니다.
► 로그인
► 계정만들기
Close