파이썬(Python)/Flask

[Python] Flask Redirect, Abort 함수 사용방법, HTTP 상태코드 보내기 예제(Status Code)

끄적끄적아무거나 2021. 11. 25. 09:29

 

 

 

 

 

 

 

 

Flask Redirect, Abort 함수(Function)이란?

 

redirect 의 기능은 응답 객체를 보내고 사용자(Client)를 원하는 위치로 이동 시켜 줍니다. 함수 사용방법은 아래와 같습니다. 

 

redirect(location, statuscode, response)

 

  • location : 보내고자 하는 위치
  • statuscode : 300번대 응답 코드 Default는 302번
  • response : 응답(Response) 시작에 필요한 파라미터

 

redirect를 일반적으로 url_for와 함께 사용하여 원하는 위치의 함수를 실행 해 줍니다. HTTP status code의 경우 3xx 번의 코드를 보낼 수 있습니다. 3XX는 Redirect 관련 응답입니다.

 

Default로 사용되는 302번의경우 영구 이동으로 바로 해당 페이지로 이동 시켜 줍니다. 그 외의 응답코드는 아래와 같습니다.

 

  • 300 : 여러 선택항목
  • 301 : 영구 이동
  • 302 : 임시 이동
  • 303 : 기타 위치 보기
  • 304 : 수정되지 않음
  • 305 : 프록시 사용
  • 307 : 임시 리다이렉션
  • 308 : 영구 리다이렉션, RFC에서 실험적으로 승인됨

 

 

 

Flask Abort 함수(Function)란?

 

Abort 함수는 4XX 번대 HTTP Status Code 를 보내는 응답입니다. 

 

abort(code)

 

사용은 위와 같이 code 번호만 넣으면 됩니다.

 

400번대 코드는 종류가 많아 주로 사용되는 항목만 아래와 같이 정리 하였습니다.

 

  • 400 : 잘못된 요청
  • 401 : 권한 없음
  • 403 : Forbidden, 금지됨
  • 404 : Not Found, 찾을 수 없음
  • 406 : 허용되지 않음
  • 415 : 지원되지 않는 미디어 유형
  • 429 : 너무 많은 요청, RFC 6585

 

 

 

Flask Redirect, Abort 함수 사용하여 HTTP 상태코드 보내기 예제

 

파이썬 코드>>

from flask import Flask, redirect, url_for, request, abort, render_template
app = Flask(__name__)

@app.route('/login',methods = ['POST', 'GET']) 
def login(): 
    if request.method == 'POST':
        if request.form['id'] == 'james':
            return redirect(url_for('admin'))
        else:
            return redirect(url_for('not_james'),300)
    else:
        return render_template('login.html')

@app.route('/failed')
def not_james():
    abort(400)

@app.route('/main')
def admin():
   return 'You Must be James'

if __name__ == '__main__':
   app.run(debug = True, port=9999)

 

7~8번 라인 : james 라는 아이디 값이 들어 올 경우 19번 줄의 admin()을 실행합니다.

10번 라인 : james라는 아이디가 아닐 경우 300번의 status 코드와 함께 not_james()를 실행합니다.

16번 라인 : abort 함수를 사용해서 400번 상태 코드를 전달 합니다. 

 

login.html>>

<!DOCTYPE html>
<html lang="en">
<head>
  <title>scribblinganything.tistory.com</title>
  <meta charset="utf-8">
  <meta name="viewport" content="width=device-width, initial-scale=1">
  <link href="https://cdn.jsdelivr.net/npm/bootstrap@5.1.2/dist/css/bootstrap.min.css" rel="stylesheet">
  <script src="https://cdn.jsdelivr.net/npm/bootstrap@5.1.2/dist/js/bootstrap.bundle.min.js"></script>
</head>
<body>

<div class="container-sm">
  <form action = "http://localhost:9999/login" method = "post">
        <input type="text" class="form-control " id="id" placeholder="id" name="id">
        <label for="아이디">아이디</label>
        <input type="text" class="form-control" id="pw" placeholder="pw" name="pw">
        <label for="pw">비밀번호</label>
    <button type="submit" class="btn btn-primary" style="float:right;" id="login">로그인</button>
  </form>
</div>
</body>
</html>

 

결과>>

크롬브라우져(Chrome Browser)를 사용해서 위와 같이 302번의 Status Code가 정상적으로 들어왔음을 알 수 있습니다.

 

이번에는 James가 아닌 아이디를 입력한 경우 입니다. 

이번에는 코드에서 설정 한대로 300번의 상태 코드가 발생하였습니다.

그리고 페이지는 Redirecting 상태로대기하고 있습니다. /failed 를 클릭하면 아래와 같이 error 코드(Bad Request)가 발생합니다.

 

상태 코드도 400번으로 정상적으로 나옵니다.