TOP
class="layout-aside-left paging-number">
본문 바로가기
[파이썬 Projects]/<파이썬 웹개발>

[파이썬] 플라스크(Flask) - 라우팅 (1)

by 기록자_Recordian 2024. 7. 13.
728x90
반응형
시작에 앞서
해당 내용은 <가장 빠른 풀스택을 위한 Flask & FastAPI>, Dave Lee 지음. BJ Public 출판.
내용을 토대로 작성되었습니다. 보다 자세한 사항은 해당 교재를 참고하시기 바랍니다.

라우팅

 
라우팅(routing)이란,
사용자가 웹 브라우저의 주소창에 특정 URL을 입력했을 때, 해당 요청이 어떤 함수 혹은 로직에 연결되는지를 결정하는 기능이다. (특정 URL을 웹 애플리케이션의 특정 코드와 연결해 주는 역할)
 
◆ 플라스크에서의 라우팅
플라스크에서 라우팅은 클라이언트 요청을 특정 함수와 연결하는 역할을 한다.
가장 기본적인 방법은 @app.route()라는 데코레이터를 사용하는 것이다. (데코레이터는 함수 위에 위치하여 해당 함수와 URL 연결)
 
[테스트 방법]

from flask import Flask
app = Flask(__name__)

@app.route('/')
def hello_wolrd():
    return 'Hello, World!'

1. app.py로 코드를 저장한 후, 터미널에서 flask run 명령으로 플라스크 애플리케이션 실행
2. http://127.0.0.1:5000/ 주소로 접속
3. 웹 브라우저에서 "Hello, World" 확인


URL 변수

 
URL 내에서 변수를 사용할 수도 있다. <variable_name> 형태로 URL 내에 위치하여 라우팅으로 연결될 함수의 인자로 선언하여, 해당 값을 받을 수 있다.
 
[테스트 방법]

from flask import Flask
app = Flask(__name__)

@app.route("/user/<username>")
def show_user_profile(username):
    return f"User {username}"

1. app.py로 코드를 저장한 후, 터미널에서 flask run 명령으로 플라스크 애플리케이션 실행
2. http://127.0.0.1:5000/user/John 주소로 접속
3. 웹 브라우저에서 "User John" 확인


HTTP 메서드

 
플라스크에서는 다양한 HTTP 메서드를 지원한다.
GET, POST, PUT, DELETE 등 ▶ method 매개변수를 통해 지정
 
[테스트 방법]

from flask import Flask, request
app = Flask(__name__)

@app.route("/login", methods=["GET", "POST"])
def login):
    if request.method = "POST":
        return "Logging in..."
    else:
        return "Login Form"

1. app.py로 코드를 저장한 후, 터미널에서 flask run 명령으로 플라스크 애플리케이션 실행
2. http://127.0.0.1:5000/login 주소로 접속. 이때에는 GET 메서드가 기본적으로 사용되므로, Login Form이 화면에 보인다.

POST 메서드는 웹 브라우저의 링크로는 테스트할 수 없으므로 기존에 익혔던 curl 명령어를 사용해야 한다.
터미널에서 flask run으로 플라스크 애플리케이션을 실행한 상태에서 터미널 메뉴 오른쪽 상단에 창 분할 아이콘을 클릭해 별도 터미널을 오픈한다. (또는 Ctrl + Shift + 5)

 
3. curl -X POST http://127.0.0.1:5000/login 명령 실행
그러나, 하단의 에러 메시지를 받았다.

Invoke-WebRequest : 매개 변수 이름 'X'과(와) 일치하는 매개 변수를 찾을 수 없습니다.

 
검색을 해보니, Invoke-WebRequest 명령어를 사용할 때 'X'이라는 매개 변수가 존재하지 않아서 발생하는 오류이며, 해당 오류를 해결하려면 명령어의 매개 변수를 정확하게 지정해야 한다고 한다.
또한, Invoke-WebRequest 명령어는 curl과 다르게 매개 변수 이름이 다른데, curl에서 사용하는 -X 매개 변수는 Invoke-WebRequest에서 -Method로 대체되어 curl 명령어를 Invoke-WebRequest로 변환해야 한다고 한다.
 
그리하여 하단의 명령어로 바꿔 다시 입력하니

Invoke-WebRequest -Uri "http://127.0.0.1:5000/login" -Method Post

POST 메서드를 사용하여 해당 주소로 요청을 보내고, 결과로 "Logging in..." 문자열이 잘 반환되었다.


URL 빌더

 
url_for() 함수를 사용하면 라우팅 함수의 이름을 기반으로 URL을 생성할 수 있다.
이 기능은 URL을 하드코딩하지 않아도 되므로 나중에 URL 구조가 변경되더라도 쉽게 대응할 수 있다.

from flask import Flask, url_for

app = Flask(__name__)

# 기본 홈페이지 경로
@app.route('/')
def index():
    return '홈페이지에 오신 것을 환영합니다!'

# 사용자 정보 페이지 경로
@app.route('/user/<username>')
def profile(username):
    # url_for() 를 사용하여 'index' 뷰 함수의 URL 생성
    return f'{username}님의 프로필 페이지 입니다. 홈으로 가기: {url_for("index")}'

 
http://127.0.0.1:5000/user/JhonDoe 로 접속해 보면 아래의 메시지를 확인할 수 있다.

여기서 "홈으로 가기: /" 부분이 url_for() 함수에 의해 동적으로 생성된 링크이다.
위의 코드는 플라스크에서 url_for() 함수의 기본적을 사용법을 보여주는데, 사용자가 /user/<username>으로 접근하면, 해당 사용자의 이름과 함께 홈페이지로 돌아갈 수 있는 링크가 제공된다.
이때 url_for() 함수는 'index' 라는 이름을 가진 함수에 매핑된 URL을 자동으로 찾아준다.


◆ 예를들어, 홈페이지의 URL을 /에서 /home으로 변경했다고 하면,

from flask import Flask, url_for

app = Flask(__name__)

# 홈페이지 경로를 /home으로 변경
@app.route('/home')
def index():
    return '홈페이지에 오신 것을 환영합니다!'

# 사용자 정보 페이지 경로
@app.route('/user/<username>')
def profile(username):
    # url_for() 를 사용하여 'index' 뷰 함수의 URL 생성
    return f'{username}님의 프로필 페이지 입니다. 홈으로 가기: {url_for("index")}'

 
 
URL 변경 후에도 profile() 함수 내부의 url_for('index') 부분을 수정할 필요가 없다. 즉, URL이 변경되어도 해당 함수는 자동으로 /home을 반환한다.


◆ url_for의 이점
 
1. 유지보수성: URL 구조가 변경되어도 url_for()를 사용하는 모든 부분을 일일이 찾아 수정할 필요가 없다. (뷰 함수의 이름이 그대로라면 알아서 적절한 URL 생성)
2. 명확성: URL 대신 뷰 함수의 이름을 사용함으로써 코드의 가독성이 향상되고, 각 링크가 어떤 뷰를 지칭하는지 명확해진다
3. 유연성: url_for() 는 뷰 함수에 정의된 변수들을 인식하고, 적절한 URL을 생성할 때 이 변수들을 URL에 포함할 수 있다
 
◆ 실무에서의 활용
 
1. 페이지 간 내비게이션: 사용자가 사이트 내에서 다른 페이지로 이동할 때 url_for()를 사용하여 동적으로 경로를 생성함으로써 라우트 변경이 발생해도 자동으로 링크가 업데이트된다.
2. 리디렉션: 사용자의 액션에 따라 특정 페이지로 리디렉션해야 할 때 url_for()를 사용하면 직접 URL을 작성하는 번거로움 없이 뷰 함수의 이름으로 쉽게 리디렉션 할 수 있다
3. 자동 URL 생성: API를 작성할 때 API 응답에 포함된 리소스에 대한 URL을 자동으로 생성할 수 있다


 
◆ url_for()의 주요 문법
 
1. url_for('뷰_함수_이름'): 뷰 함수의 이름을 기반으로 해당 뷰 함수에 매핑된 URL 반환
2. url_for('뷰_함수_이름', **values): 뷰 함수에 전달되어야 하는 변수들을 values에 '변수=변숫값 형태(예. user_id = 123, user_name='John')로 넣어주면 해당 변수들을 포함한 URL을 생성
 
[테스트 방법]

from flask import Flask, url_for

app = Flask(__name__)

# 뷰 함수: 사용자 프로필
@app.route('/user/<username>')
def show_user_profile(username):
    # 실제로는 사용자 프로필 정보를 보여주는 로직이 위치
    return f'User {username}'

# 뷰 함수: 게시글
@app.route('/post/<year>/<month>/<day>')
def show_post(year, month, day):
    # 실제로는 해당 날짜에 해당하는 게시글 보여주는 로직이 위치
    return f'{year}/{month}/{day}'

# 홈페이지에서 url_for를 사용하여 위의 뷰 함수들로 이동하는 링크 생성
@app.route('/')
def index():
    # 'show_user_profile' 뷰로 이동하는 url 생성
    user_url = url_for('show_user_profile', username='johndoe')
    post_url = url_for('show_post', year='2023', month='04', day='01')
    # 생성된 url 반환
    return f'User URL: {user_url}<br>Post URL: {post_url}'

1. app.py로 코드를 저장한 후, 터미널에서 flask run 명령으로 서버 시작
2. http://127.0.0.1:5000 주소로 접속
3. 홈페이지에 생성된 User URL과 Post URL 확인
이 URL들을 클릭하면 해당 사용자의 프로필과 날짜별 게시물 페이지로 이동

 
3. url_for('static', filename='파일_이름'): 플라스크 애플리케이션 내에서 정적 파일(이미지, CSS, 자바스크립트 파일 등)의 URL을 생성할 때 사용된다.
플라스크는 기본적으로 'static' 폴더 내의 파일들을 정적 파일로 서비스하며, filename 인자에는 정적 파일의 경로와 이름을 포함한다.
예. CSS 파일을 링크하고 싶은 경우 경로는 'static/css/style.css'

css_url = url_for('static', filename='css/style.css')

 
4. url_for('뷰_함수_이름', _scheme='https', _external=True): 주로 외부 링크를 생성할 때 사용된다.
_scheme: URL에 사용될 프로토콜 지정 (일반적으로 http-기본값이나 https가 사용되나, ftp나 mailto 같은 다른 스키마도 사용가능)
_external=True: 절대 URL 생성 (주로 외부 서비스나 이메일에서 전체 URL이 필요할 때 사용)

external_url = url_for('show_user_profile', username='John Doe', _shcheme='https', _external=True)

▶ 외부에서 접근 가능한 HTTPS 프로토콜을 사용하는 사용자 프로필 페이지의 전체 URL 생성
 
 
★ 위에서 주어진 url_for() 문법을 테스트할 수 있는 플라스크 전체 코드

from flask import Flask, url_for

app = Flask(__name__)

# 홈페이지
@app.route('/')
def index():
    # url_for('index' 호출)
    return f'홈페이지: {url_for("index")}'

# 사용자 프로필 페이지
@app.route('/user/<username>')
def user_profile(username):
    return f'{username}의 프로필 페이지: {url_for("user_profile", username=username)}'

# 정적 파일 테스트를 위한 경로
@app.route('/static-example')
def static_example():
    return f'정적 파일 URL: {url_for("static", filename="style.css")}'

# 절대 URL 테스트
@app.route('/absolute')
def absolute():
    return f'외부 절대 URL: {url_for("index", _external=True)}'


# HTTPS와 절대 URL 테스트
@app.route('/https')
def https():
    return f'HTTPS 절대 URL: {url_for("index", _scheme="https", _external=True)}'

 
[테스트 방법]
1. 위 코드를 app.py 파일에 저장 후, 터미널에서 flask run 명령으로 플라스크 서버 시작
2. 웹 브라우저를 열고 다음 각각의 경로를 방문하여 결과 확인

▶ url_for() 함수는 index 라는 이름의 함수를 찾아 플라스크 라우팅 시스템에 등록된 해당 경로 반환

▶ url_for() 함수는 user_profile이라는 뷰 함수 이름과 username이라는 변수를 values 매개변수로 전달하면, 플라스크는 동적 경로 /user/<username>에 대응하는 URL 생성

 
▶ 플라스크는 /static/style.css 라는 경로로 파일에 접근할 수 있는 URL 생성

▶ _external=True 옵션을 사용하면 ful_for()는 도메인을 포함한 전체 URL 생성.
이 옵션은 외부에서 접근 가능한 URL이 필요할 때 유용.

▶ _scheme='https' 옵션은 생성되는 URL 의 스키마를 지정. _external=True와 함께 사용하면 https를 사용하는 완전한 절대 URL 생성.
이는 웹사이트가 SSL 인증서를 사용하여 보완을 강화한 경우 적용을 고려해볼 수 있음.


다음 내용

 

[파이썬] 플라스크 - 라우팅 (2)

시작에 앞서해당 내용은 , Dave Lee 지음. BJ Public 출판.내용을 토대로 작성되었습니다. 보다 자세한 사항은 해당 교재를 참고하시기 바랍니다.이전 내용 [파이썬] 플라스크 - 라우팅 (1)시작에 앞서

puppy-foot-it.tistory.com

 

728x90
반응형