기록과 정리의 공간

[Flask] 리다이렉트(Redirect) 본문

라이브러리&프레임워크/Flask

[Flask] 리다이렉트(Redirect)

딸기맛도나쓰 2020. 8. 1. 16:07

1. flask.redirect()

  • (공식 문서 링크)
  • 호출 될 경우, 클라이언트를 대상 위치로 리디렉션하는 응답 오브젝트 (WSGI 애플리케이션)를 리턴한다.
  • 첫 번째 인자로 location을 받는다. 이는 응답이 redirect해야하는 위치를 의미한다.

2. flask.url_for()

  • (공식 문서 링크1), (공식 문서 링크2)
  • 라우팅이 설정된 함수에 대한 URL을 얻어내기 위해 사용할 수 있다.
  • 첫 번째 인자로 함수의 이름을 받고, 두 번째 부터는 URL 룰의 변수 부분에 대한 다수의 키워드를 인자로 받는다.
  • 참고로 url_for()는 html파일에서 jinja문법을 통해 사용될 수 있다. ex> <a href="{{url_for('board_view')}}">내용</a>
  • 예를들어 '/view'이런식으로 직접 url을 쓰지 않고, url_for()를 사용하는 이유는, url을 변경해야할 때 '/view'로 작성된 모든 부분을 변경해주지 않아도 url_for()가 인자로 받은 함수에 대한 url을 알아서 찾아주기 때문이다. 즉, 직접 일일이 변경해주지 않아도 되기 때문이다.

3. 예제들

  • 예제1

    • 서버를 실행시키고, http://127.0.0.1:5000/로 접속하면, 아래 이미지와 같이 /login으로 리다이렉트되는 것을 확인 할 수 있다.
# 예제1
from flask import Flask, abort, redirect, url_for


app = Flask(__name__)


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


@app.route('/login')
def login():
    abort(401)


if __name__ == "__main__" :
    app.run()
  • 예제2 - 쿼리 스트링이 존재하는 url

    • request.args.get('변수이름')을 사용하여 /user?변수=값&변수=값&...에서 원하는 변수의 값을 얻을 수 있다.
    • 참고> request.args.get('idx', 1, type=int) 와 같이 idx값이 존재하지 않을 경우, 두 번째 인자에 default값을 지정할 수 있고 그 값의 type또한 지정해줄 수 있다.
    • 서버를 실행시켜 http://127.0.0.1:5000/로 접속하면, 아래와 같이 http://127.0.0.1:5000/user?username=hong으로 리다이렉트 됨.
# 예제2
from flask import Flask, url_for, redirect, url_for, request

@app.route('/')
def index(): 
    return redirect(url_for('profile', username="hong"))

@app.route('/user')
def profile(): 
    username = request.args.get('username')
    return username

if __name__ == "__main__":
    app.run(debug=True)
# 예제3 
from flask import Flask, url_for, redirect, url_for, request

app = Flask(__name__)

@app.route('/')
def index(): 
    return redirect(url_for('profile', username="hong"))

@app.route('/user/<username>')
def profile(username): 
    return username

if __name__ == "__main__":
    app.run(debug=True)
  • 참고로 위 코드에서 데이터 타입 또한 아래와 같은 형식으로 지정해줄 수 있다. 데이터 타입을 명시하지 않는다면, string으로 지정됨.
<int:username> 
Comments