변수와 컨버터
Flask의 라우팅 시스템은 '변수' 기능을 제공한다.
<변수_이름> 구문을 이용하여 변수를 사용할 수 있다. 이 표기법은 거의 표준처럼 사용되고 있으며, 이렇게하여 엔드포인트를 동적으로 표현할 수 있다.
예를 들어 고유한 사용자 ID를 N으로 표현한다고 할 때 ./person/N에 대한 요청을 처리하는 함수를 만들려면 route에 /person/를 인수로 넘겨주면 된다. Flask가 데코레이트 함수를 호출할 때 URL에서 위치의 값을 person_id 인수로 변환해준다.
예시 코드는 다음과 같다.
from flask import Flask, jsonify
app = Flask(__name__)
@app.route('/api/person/<person_id>')
def person(person_id):
resp = jsonify({'Hello':person_id})
return resp
if __name__ == '__main__':
app.run()
애플리케이션 실행 후 터미널을 실행하여 다음과 같이 호출한다.
$ curl localhost:5000/api/person/JH
{"Hello":"JH"} // JH로 호출하여 JH 반환
또한 변수를 특정 타입으로 변환해주는 컨버터가 있습니다. 예를 들어 정수 타입의 변수를 사용한다면 int:변수_이름으로 표현합니다. 앞의 예제 코드에 적용하면 /person/<int: person_id>로 표시할 수 있습니다.
기본으로 제공되는 컨버터는 다음과 같습니다.
- string(유니코드가 기본)
- int
- float
- path : 슬래시('/')를 포함
- any : 여러 개의 값을 조합
- uuid : UUID 스트링 매칭
필요하다면 사용자 정의 컨버터도 쉽게 만들 수 있습니다.
예를 들어 사용자 ID와 이름을 매칭하고 싶다면 저장된 데이터에서 ID에 해당하는 이름을 찾아 변환해주는 컨버터를 만들면 됩니다.
위의 내용을 구현하기 위해서는 BasicConverter 클래스를 상속하는 클래스가 필요합니다. 이 클래스는 두 개의 함수를 구현하는데, to_python()은 URL 경로를 파이썬 객체로 변화하여 뷰에서 사용할 수 있게 하며 , to_url()은 주어진 인수에 해당하는 URL을 만들기 위해 url_for()에서 사용합니다.
예시 코드는 다음과 같습니다.
from flask import Flask, jsonify, request
from werkzeug.routing import BaseConverter, ValidationError
USERS = {'1': 'Tom', '2': 'John'}
IDS = {val: id for id, val in USERS.items()}
class RegisteredUser(BaseConverter):
def to_python(self, value):
'''
URL 경로를 파이썬 객체로 변환 (ID->유저명)
:param value: 요청된 value
:return: 유저 이름 반환
'''
if value in USERS:
return USERS[value]
raise ValidationError() # 등록되지 않은 유저의 경우 Error raise
def to_url(self, value):
'''
주어진 인수에 해당하는 URL을 만들기 위한 함수(유저명 -> ID)
:param value:
:return:
'''
return IDS[value]
app = Flask(__name__)
app.url_map.converters['registered'] = RegisteredUser
@app.route('/api/person/<registered:name>')
def person(name):
resp = jsonify({'Hello': name})
return resp
if __name__ == '__main__':
app.run()
애플리케이션 실행후 터미널을 새로 생성하여 다음과 같이 요청합니다.
$ curl localhost:5000/api/person/1
{"Hello":"Tom"}
$ curl localhost:5000/api/person/2
{"Hello":"John"}
$ curl localhost:5000/api/person/3
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2 Final//EN">
<title>404 Not Found</title>
<h1>Not Found</h1>
<p>The requested URL was not found on the server. If you entered the URL manually please check your spelling and try again.</p>
주의할 점으로는 실제 애플리케이션에서는 컨버터를 너무 사용하지 않는 것입니다. 코드가 변경됐을 때 모든 라우트를 바꿔주는 것은 힘든 작업이기 때문입니다.
Flask의 변수와 컨버터에 대하여 알아보았습니다.
다음 도서를 참고하였습니다.
'About > Flask' 카테고리의 다른 글
[Python] Flask Session 저장, 불러오기, 삭제 (0) | 2021.09.05 |
---|---|
[Python] Flask url_for 함수 (0) | 2021.09.05 |
[Python] boto3를 이용한 Flask-S3 연동 (파일 업로드 및 다운로드) (1) | 2021.07.19 |
[Python] Flask를 이용한 요청 처리 (0) | 2021.06.07 |
[Python] MicroService에서 twisted의 문제점 (0) | 2021.06.06 |