시작에 앞서
해당 내용은 <가장 빠른 풀스택을 위한 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 인증서를 사용하여 보완을 강화한 경우 적용을 고려해볼 수 있음.
다음 내용
'[파이썬 Projects] > <파이썬 웹개발>' 카테고리의 다른 글
[파이썬] 플라스크(Flask) - 요청과 응답 (1) | 2024.07.14 |
---|---|
[파이썬] 플라스크(Flask) - 라우팅 (2) (1) | 2024.07.14 |
[파이썬] 플라스크(Flask) - Hello, World! 애플리케이션 만들기 (0) | 2024.07.13 |
[파이썬] curl 명령어 (0) | 2024.07.13 |
[파이썬] 프레임워크 (0) | 2024.07.13 |