웹개발/Flask

Routing, route 데코레이터, 라우트, debug mode, 디버그 모드, converter, 컨버터

Olivia-BlackCherry 2022. 11. 6. 19:39
route

최근에는 URL을 완성할 때, 의미있는 단어를 사용하는 것이 추세이다. 왜냐면, abc, 123 등과 같은 의미없는 단어를 주소로 사용하는 것보다, shopping, store, pay 등 해당 페이지가 어떤 내용을 담고 있을지 예측할 수 있는 단어를 사용한다면 사용자들이 URL을 기억하기 쉽기 때문이다.

 

Flask에서는 route() 데코레이터를 사용하여 기본 URL에 의미있는 단어를 덧붙여 특정 함수를 연결한다. 

 

예를 들어보자.

아래의 코드는 기본 URL이다.

Flask에서 생성한 객체 app에 의미있는 단어를 사용한 것은 아니고, 단순히 (' / ')로 route 데코레이터를 만든 것인데,

URL 주소가 ' / '로 끝나는 곳에 hello_world 함수를 불러오도록 한다.

from flask import Flask

app = Flask(__name__)

@app.route("/")
def hello_world():
    return "<p>Hello, World!</p>"

 

이번에는 의미있는 단어를 사용한 route decorator 예를 보자.

아래의 경우에는 '/hello'라고 끝나는 URL에서 

hello 함수를 실행시킨다. 

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

 

만약, URL 주소에 변수를 지정하는 경우에는 어떻게 할까? 

< > 중괄호를 이용하면 된다. 

그렇게하면 Flask는 '<변수이름>'을 키워드 인자로 받아 해당 함수를 불러올 것이다. 

 

아래의 예시를 보자.

URL 주소의 끝에 /user/ 다음에 어떤 변수가 와도, 

실제 함수에서 그 변수가 적용되어 실행된다. 

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

아래와 같이 바로 변수 이름을 적어줘도 된다.

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

마찬가지로 뒤에 다른 경로를 추가할 수도 있다.

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

 

debug mode

디버그 모드를 실행하면 두 가지가 활성화된다. 

첫 번째, 리로더(reloader)이다. 파일을 수정한 후 저장하면, 서버를 자동으로 로드하는 기능이다.

원래는 서버 파일에 변동이 있다면, 서버를 멈추고 다시 실행해야 변경된 사항이 적용되기 때문에

매번 멈춤, 실행 버튼을 누르는 것이 번거롭다. 

하지만 이때, 디버그 모드를 사용하면

저장만 하면 코드가 자동으로 업데이트되어 반영되므로 매우매우 편리하다.

app.run(debug=True)

디버그 모드는 on/off 가 있어 원하는 대로 끄고 켤 수 있는데,

디버그 모드를 실행하고자 한다면 debug=True로 한다.

from flask import Flask
app = Flask(__name__)

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

if __name__ == "__main__":
    app.run(debug=True)
 

 

 

두 번째, 디버거(debugger)인데, 에러가 났을 때 어떤 이슈인지 확인할 수 있어 문제 해결에 도움을 준다. 

아래의 코드를 실행하면 에러가 발생한다. 

디버거 모드를 on하면, 브라우저에 어떤 에러인지 보여준다.

에러를 확인하면, 문제를 해결하는 방법을 파악하는데 도움이 된다.

@app.route('/hello/<username>')
def hello_world(name):
    return f'Hello great {username} World!'

 

Type Error 타입에러가 발생했다.

파라미터에는 name이라고 적혀져 있는데, 실제 들어가야 하는 변수명은 username이기 때문에 발생한 에러이다.

 

에러에 대한 설명의 맨 오른쪽을 보면 command 아이콘이 활성화 되는데, 이 디버거 버튼을 누르면

해당 행에 있는 콘솔창이 활성화된다.

 

핀을 입력하라는 문구가 나온다.

아무나 디버거에 접근할 수 없도록,

나의 정보를 보호하기 위해 해놓은 안전 장치이다.

 

핀은 파이참 콘솔창에서 확인할 수 있다.

 

 

 

converter

컨버터는 URL을 지정한 데이터 유형으로 변환한다.

string은 문자열로 slash(/)가 없어도 어떤 글자든 문자열로 받는다.

int는 양수로 받는다.

float는 양의 소수점으로 받는다.

path는 경로를 뜻하는데, string과 비슷하다. 하지만 slash(/)가 있어야 한다. 

from flask import Flask
app = Flask(__name__)

@app.route('/hello/<username>/<int:number>')
def hello_world(username, number):
    return f'Hello great {username} {number} World!'

if __name__ == "__main__":
    app.run(debug=True)

출력화면>>