동적 웹 애플리케이션을 위한 의미 있는 URL

PythonBeginner
지금 연습하기

소개

현대 웹 애플리케이션은 사용자를 돕기 위해 의미 있는 URL 을 사용합니다. 사용자는 기억하기 쉽고 페이지를 직접 방문하는 데 사용할 수 있는 의미 있는 URL 을 사용하는 페이지를 더 좋아하고 다시 방문할 가능성이 높습니다. 이 Lab 에서는 동적 URL 을 구현하고 Flask 에서 여러 규칙을 함수에 연결하는 방법에 중점을 둡니다.

라우트 데코레이터 (Route Decorator)

이 단계에서는 route() 데코레이터를 사용하여 여러 뷰 함수를 여러 URL 에 바인딩합니다.

  1. route_decorator.py 파일을 열고 Flask 클래스를 가져와서 인스턴스를 생성합니다.
from flask import Flask
app = Flask(__name__)
  1. 다음으로 route() 데코레이터를 사용하여 //hello 두 개의 라우트를 생성하고, 해당 뷰 함수를 바인딩하여 각각 Index PageHello, World를 반환하도록 합니다.
@app.route('/')
def index():
    return 'Index Page'

@app.route('/hello')
def hello():
    return 'Hello, World'
  1. 포트 5000 에서 Flask 애플리케이션을 시작하고 debug 모드를 활성화하기 위해 스크립트의 main 진입점을 생성합니다.
if __name__ == "__main__":
    app.run(host='0.0.0.0', port=5000, debug=True)
  1. 애플리케이션을 실행하려면 먼저 다음 명령을 사용하여 터미널에서 Flask 애플리케이션을 실행합니다.
python3 route_decorator.py

그런 다음 인터페이스 상단에 있는 "Web 5000" 탭을 열고 페이지를 새로 고치면 Index Page 메시지를 볼 수 있습니다.

/hello 라우트의 경우, URL 표시줄에 직접 hello 접미사를 추가할 수 있습니다.

Flask route decorator example

그러면 페이지에 Hello, World 메시지가 표시됩니다.

변수 규칙 (Variable Rules)

이 단계에서는 <variable_name>으로 섹션을 표시하여 URL 에 변수 섹션을 추가합니다. 선택적으로 <converter:variable_name>과 같이 변수의 유형을 지정하기 위해 컨버터 (converter) 를 사용할 수 있습니다.

  1. variable_rules.py 파일을 열고, 먼저 Flask 클래스와 escape를 가져온 다음 Flask 클래스의 인스턴스를 생성합니다.
from flask import Flask
from markupsafe import escape
app = Flask(__name__)
  1. route() 데코레이터에서 <variable_name><converter:variable_name> 패턴을 추가하여 변수 섹션이 있는 동적 URL 을 생성합니다. 뷰 함수가 형식화된 문자열을 반환하도록 합니다.
@app.route('/user/<username>')
def show_user_profile(username):
    ## show the user profile for that user
    return f'User {escape(username)}'

@app.route('/post/<int:post_id>')
def show_post(post_id):
    ## show the post with the given id, the id is an integer
    return f'Post {post_id}'

@app.route('/path/<path:subpath>')
def show_subpath(subpath):
    ## show the subpath after /path/
    return f'Subpath {escape(subpath)}'
  • 다음은 일반적인 컨버터 유형의 표입니다.
유형 역할
string (기본값) 슬래시 없이 모든 텍스트 허용
int 양의 정수 허용
float 양의 부동 소수점 값 허용
path string과 유사하지만 슬래시도 허용
uuid UUID 문자열 허용
  1. 포트 5001 에서 Flask 애플리케이션을 시작하고 debug 모드를 활성화하기 위해 스크립트의 main 진입점을 생성합니다.
if __name__ == "__main__":
    app.run(host='0.0.0.0', port=5001, debug=True)
  1. 애플리케이션을 실행하려면 먼저 다음 명령을 사용하여 새 터미널에서 Flask 애플리케이션을 실행합니다.
python3 variable_rules.py

그런 다음 인터페이스 상단에 있는 "Web 5001" 탭을 열고 URL 표시줄에 직접 user/Alice 접미사를 추가합니다.

Flask dynamic URL example

그러면 페이지에 User Alice 메시지가 표시됩니다.

  1. 접미사 post/1path/some/path에 대해서도 동일한 작업을 반복할 수 있습니다. 접미사 post/1의 경우 Post 1 메시지가 표시됩니다. 접미사 path/some/path의 경우 Subpath some/path 메시지가 표시됩니다.

리다이렉션 동작 (Redirection Behavior)

이 단계에서는 후행 슬래시 (trailing slash) 사용에 따라 두 가지 규칙이 어떻게 다른지 배웁니다.

  1. redirection_behavior.py 파일을 열고, Flask 클래스를 가져와서 인스턴스를 생성합니다.
from flask import Flask
app = Flask(__name__)
  1. route() 데코레이터를 사용하여 projects라는 뷰 함수가 있는 /projects/라는 라우트를 생성합니다.
@app.route('/projects/')
def projects():
    return 'The project page'

projects 엔드포인트의 정식 URL 에는 후행 슬래시가 있습니다. 이는 파일 시스템의 폴더와 유사합니다. 후행 슬래시 없이 URL(/projects) 에 액세스하면 Flask 는 후행 슬래시가 있는 정식 URL(/projects/) 로 리디렉션합니다.

  1. about이라는 뷰 함수가 있는 /about이라는 다른 라우트를 생성합니다.
@app.route('/about')
def about():
    return 'The about page'

about 엔드포인트의 정식 URL 에는 후행 슬래시가 없습니다. 이는 파일의 경로 이름과 유사합니다. 후행 슬래시 (/about/) 가 있는 URL 에 액세스하면 404 Not Found 오류가 발생합니다. 이는 검색 엔진이 동일한 페이지를 두 번 인덱싱하는 것을 방지하는 데 도움이 되므로 이러한 리소스에 대한 URL 을 고유하게 유지하는 데 도움이 됩니다.

  1. 포트 5002 에서 Flask 애플리케이션을 시작하고 debug 모드를 활성화하기 위해 스크립트의 main 진입점을 생성합니다.
if __name__ == "__main__":
    app.run(host='0.0.0.0', port=5002, debug=True)
  1. 애플리케이션을 실행하려면 먼저 다음 명령을 사용하여 새 터미널에서 Flask 애플리케이션을 실행합니다.
python3 redirection_behavior.py

그런 다음 인터페이스 상단에 있는 "Web 5002" 탭을 열고 URL 표시줄에 직접 projects 접미사를 추가합니다.

Flask projects route example

그러면 페이지에 The project page 메시지가 표시됩니다. 이는 /projects/ 라우트로 리디렉션되기 때문입니다.

projects 대신 다른 접미사 about/을 추가합니다.

404 error page display

Not Found 메시지가 표시되어 404 오류를 나타냅니다. 접미사를 about으로 변경하면 올바른 메시지 The about page가 표시됩니다.

URL 생성 (URL Building)

이 단계에서는 url_for() 함수를 사용하여 특정 함수에 대한 URL 을 생성합니다. 이 함수는 첫 번째 인수로 함수 이름을, 그리고 URL 규칙의 변수 부분에 해당하는 임의의 수의 키워드 인수를 받습니다. 알 수 없는 변수 부분은 쿼리 매개변수로 URL 에 추가됩니다.

  1. url_building.py 파일을 열고, 먼저 Flask 클래스와 url_for를 가져옵니다. 또한 Flask 클래스의 인스턴스를 생성하는 것을 잊지 마세요.
from flask import Flask, url_for
app = Flask(__name__)
  1. route() 데코레이터를 사용하여 세 개의 라우트를 생성하고 해당 뷰 함수를 정의합니다.
@app.route('/')
def index():
    return 'index'

@app.route('/login')
def login():
    return 'login'

@app.route('/user/<username>')
def profile(username):
    return f'{username}\'s profile'
  1. url_for()를 사용해 보기 위해 test_request_context() 메서드를 사용합니다. 이 메서드는 Python 셸을 사용하는 동안에도 Flask 가 요청을 처리하는 것처럼 동작하도록 지시합니다.
with app.test_request_context():
    print(url_for('index'))
    print(url_for('login'))
    print(url_for('login', next='/'))
    print(url_for('profile', username='John Doe'))
  • url_for('index')는 뷰 함수 index에 대한 URL 을 생성하여 /를 반환합니다.
  • url_for('login')은 뷰 함수 login에 대한 URL 을 생성하여 /login을 반환합니다.
  • url_for('login', next='/')는 뷰 함수 login에 대한 URL 을 생성하고 추가 쿼리 매개변수 next를 포함하여 /login?next=/를 반환합니다.
  • url_for('profile', username='John Doe')는 username 변수를 John Doe로 설정하여 뷰 함수 profile에 대한 URL 을 생성하여 /user/John%20Doe를 반환합니다.
  1. 새 터미널에서 url_building.py 파일을 직접 실행합니다.
python3 url_building.py

다음과 같은 출력이 표시됩니다.

/
/login
/login?next=/
/user/John%20Doe

요약

이 Lab 에서는 의미 있는 URL 을 만드는 다양한 방법을 배웠습니다. 웹 애플리케이션을 설계할 때 매우 중요합니다. Flask 의 라우팅 기능을 능숙하게 사용함으로써 사용자의 경험을 향상시키는 체계적이고 직관적인 URL 을 만들 수 있습니다.