본문 바로가기

About/Flask

[Python] Flask 전역 공간 (Flask.g)

전역 공간

flask.g 변수에는 모든 전역 정보가 포함돼있고, 원하는 어떤 속성이든 여기에 설정할 수 있다.

플라스크에서 @app.before_request 데코레이터는 요청이 만들어지고 뷰에 전달하기 직전에 호출할 함수가 있을 때 사용한다.

before_request 를 사용하는 일반적인 경우는 전역 공간에 값을 저장할 때 이다.

before_request 를 사용하면 컨텍스트 안에서 요청되는 모든 함수는 g 변수를 사용해서 데이터를 얻을 수 있다.


다음 예시를 보자

from flask import Flask, jsonify, g, request

app = Flask(__name__)

@app.before_request
def authenticate():
    # request.authorization username이 있는 경우 g.user에 할당
    g.user = 'Anonymous' if not request.authorization else request.authorization['username']


@app.route('/api')
def my_microservice():
    # authenticate()에서 할당한 g.user 반환
    return jsonify({'username': g.user})


if __name__ == "__main__":
    app.run()
  • 요청이 오는 경우 *autehnticate() * 에서 username을 확인하여 g(전역변수)의 user에 할당한다. username이 없는 경우 'Anonymous'를 할당한다.
  • /api 로 요청이 오는경우 my_microservice() 에서 g.user 를 반환한다.

실행 결과는 다음과 같다.

(base) ~ % curl localhost:5000/api
{"username":"Anonymous"}
(base) ~ % curl localhost:5000/api --user jh:pass
{"username":"jh"}
  • 옵션을 주지 않고 요청 시 g.user'Anonymous' 가 할당된 것을 확인할 수 있다.
  • --user jh:pass 옵션을 주었을 경우 g.user'jh' 가 할당된 것을 확인할 수 있다.

요청과 관련된 데이터라고 생각되면 flask.g 를 통해 코드 전체에서 공유할 수 있다.

하지만 전역으로 사용하는 변수는 남용하지 않고 필요한 경우만 쓰는 것이 바람직해보입니다.

 

다음 도서를 참고하였습니다.

https://www.aladin.co.kr/shop/wproduct.aspx?ItemId=191830482 

 

파이썬 마이크로서비스

파이썬에 대한 기본 지식, 커맨드라인, HTTP 기반 애플리케이션에 대한 기본 지식을 갖추고 있으며, 파이썬 3를 활용한 마이크로서비스 개발, 테스트, 확장, 관리 방법을 배우고 싶은 독자를 대상