파이썬(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번으로 정상적으로 나옵니다.

    반응형