가오리의 코딩일기

Ep02. 라우팅, 변수 규칙, 후행 슬래시, url 구축, http 메소드 본문

Python/flask

Ep02. 라우팅, 변수 규칙, 후행 슬래시, url 구축, http 메소드

류경혜 2022. 7. 9. 15:00

💡 라우팅(Routing)

→  플라스크에서 함수는 각각의 주소를 입력해서 들어오는 요청을 담당하는 담당자

→ 어떤 요청을 어떤 함수가 응답할 것인가를 연결시켜주는 작업이 필요한데 이런 작업을 라우팅

→ 그런 작업을 기술하는 어떤 것을 라우터라고 한다

 

 

데코레이터(장식자)를 사용해서 route() 함수에 URL을 바인딩한다

→ @로 시작하는 것들, 장식하는 도구, 함수를 장식한다고 해서 이런 이름이 붙었다

# 사용자가 어떤 경로를 입력하지 않고 접속하면 인덱스 함수가 응대하라고 담당자를 지정한 것
@app.route('/')
def index():
    return 'Welcome!'

# /hi/<username>로 접속했을 때 hi() 함수가 응대해서 hi, {username}를 응답한다
@app.route('/hi/<username>')
def hi(username):
    return f'Hi, {username}'

 

 

 

 

💡 변수 규칙(Variable Rules)

→ <>(꺽새)를 이용해 가변적으로 변하는 변수를 route()가 받기 위해서 쓰는 방법

→ 변수에 입력된 값과 같은 이름의 파라미터에 전달된다

→ 그러므로 변수명과 함수명의 파라미터 명이 동일해야 한다

 

 

 

 

💡 후행 슬래시(Trailing Slash)

→ 아래의 두 개의 route() 안의  마지막 부분에 슬래시가 있는가 없는가의 차이
a. 슬래시가 있는 경우
 → 파일 시스템의 폴더와 비슷하고 후행 슬래시없이 URL에 액세스하면 플라스크가 후행 슬래시가 있는 표준 URL로 리다이렉트한다.
b. 슬래시가 없는 경우
 → 파일의 경로 이름과 비슷하고 슬래시가 있는 URL에 액세스하면 404 NOT Found 에러를 발생시킨다.
→ 이러한 리소스가 고유한 URL을 유지하여 검색 엔진이 동일한 페이지를 두 번 인덱싱하는 것을 방지할 수 있다.

 

# 슬래시가 있을 때 
@app.route('/login/')
def login():
    return 'The login page'

# 슬래시가 없을 때
@app.route('/logout')
def logout():
    return 'the logout page'

 

 

 

 

💡 url 구축(URL Building)

→ 특정 함수에 대한 URL을 작성하려면 url_for() 함수를 사용하면 된다

→ 함수의 이름을 첫 번째 인수로, 키워드 인수의 수는 각각의 URL 규칙의 변수 부분에 해당한다.

 

✏️ 왜 템플릿에 하드코딩에 대신 반전 기능이 있는 url_for() 함수를 사용해서 URL을 작성할까?

→ 대분분의 경우 리버싱 함수는 하드코딩된 URL보다 가독성이 좋다

→ 하드코딩된 URL을 수동으로 변경하는 것을 기억할 필요없이 URL을 한 번에 변경할 수 있다

→ URL 작성은 특수 문자 및 유니코드 데이터의 이스케이프를 투명하게 처리한다

→ 생성된 경로는 항상 절대 경로이므로 브라우저에서 상대경로의 예기치 않은 동작이 발생하지 않는다

→ 응용 프로그램이 URL root 외부에 배치되어있는 경우 적절하게 처리를 도와준다.

with app.test_request_context():
    print(url_for('index'))      
    print(url_for('hi', username='ryukyung'))
    print(url_for('login'))
    print(url_for('login', next='/')) 
    print(url_for('logout'))

 

 

 

💡 HTTP 메소드(HTTP Method)

→ 웹 애플리케이션은 URL에 엑세스할 때 다른 http methods를 사용한다

→ route()의 인수인 methods를 사용하여 다른 http methods를 처리할 수 있다

 

✏️ GET

→ URL을 통해 서버로 데이터를 전송하는 방식

→ 어떤 값이나 내용, 상태 등을 바꾸지 않는 경우에 사용하는 것

     ex) 게시판에서 글의 내용에 대한 목록을 보여주거나 글의 내용을 볼 때

 

✏️ POST

→ 서버 상의 데이터 값이나 상태를 바꾸기 위해 사용한다

    ex) 게시판에서 글의 내용을 저장하고 수정할 때 

 

@app.route('/create/', methods=['GET', 'POST'])
def create():
    if request.method == 'GET':
        content = '''
            <form action="/create/" method="POST">
                <p><input type="text" name="title" placeholder="title"></p>
                <p><input type="text" name="character" placeholder="character"></p>
                <p><input type="submit" value="create"></p>
            </form>
        '''
        return template(getContents(), content)
    elif request.method == 'POST':
        global nextId
        title = request.form['title']
        character = request.form['character']
        newTopic = {'id': nextId, 'title': title, 'character': character}
        topics.append(newTopic)
        url = '/read/'+str(nextId)+'/'
        nextId = nextId + 1
        return redirect(url)