본문 바로가기

About/Flask

[Python] Flask 변수와 컨버터

변수와 컨버터

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의 변수와 컨버터에 대하여 알아보았습니다.

 

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

http://book.interpark.com/product/BookDisplay.do?_method=detail&sc.prdNo=308016887&gclid=Cj0KCQjw1dGJBhD4ARIsANb6OdlkqAj2YL_AXHa17VdXjr5uSyAL0TNWF0Zn4f_jOScHWyJF6ObCt0caAo3PEALw_wcB 

 

싸니까 믿으니까 인터파크도서

[이 책에서 다루는 내용] - 마이크로서비스 이해와 설계 방법 - 파이썬 3, 플라스크, Tox, 다른 도구와 모범 사례를 사용해 서비스를 만드는 방법 - TDD 활용법 - 마이크로서비스의 문서화 방법 - 코

book.interpark.com