본문 바로가기

About/Flask

[Python] Flask url_for 함수

url_for 함수

플라스크의 라우팅 시스템에서 흥미 있는 또 다른 기능은 url_for() 함수 입니다. 이 함수는 주어진 뷰의 실제 URL을 반환합니다.

변수와 컨버터에서 사용한 예제를 사용하겠습니다.

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
# app.py
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()
cs

 

다음과 같이 app.py를 작성하고, url_for_test.py 파일을 생성합니다.

1
2
3
4
5
6
#url_for_test
from app import app
from flask import url_for
with app.test_request_context():
   print(url_for('person', name='Tom'))
cs

실행 결과

/api/person/1

url_for('person', name='Tom')

 

위와 같이 호출하게 되면 'person' URL에서 name의 값이 'Tom'이 되는 url 주소를 반환한다.

이것이 가능한 이유는 app.py의 RegisteredUser 클래스에 선언된 to_url() 함수가 name 변수를 ID로 변환하였기 때문이다.

이 기능은 예제 코드와 같이 실행 문맥에 따라 URL이 달라지는 경우에 유용합니다.

URL을 하드코딩하는 대신 url_for에 함수 이름을 전달하여 정확한 URL을 얻을 수 있습니다.


Flask의 url_for() 함수에 대하여 알아보았습니다.

 

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

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

 

파이썬 마이크로서비스

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

www.aladin.co.kr