전역 공간
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
'About > Flask' 카테고리의 다른 글
[Flask] Jinja2 템플릿을 이용한 이메일 생성 (0) | 2021.12.13 |
---|---|
[Python] Flask Signal (Blinker) (0) | 2021.09.25 |
[Python] Flask Session 저장, 불러오기, 삭제 (0) | 2021.09.05 |
[Python] Flask url_for 함수 (0) | 2021.09.05 |
[Python] Flask 변수와 컨버터 (0) | 2021.09.05 |