파이썬 웹 서비스 만들기

10. 맞춤형 오류 페이지

영바이트 2020. 12. 1. 23:04

인터넷에서 웹 페이지들을 돌아다니다 보면 종종 오류 화면을 마주치게된다. 대표적인 오류가 아래 그림과 같은 '요청한 페이지가 존재하지 않음', 즉 HTTP 404 오류이다.

 

HTTP 404 오류 - 요청한 페이지가 존재하지 않음

 

오류들의 종류를 찾아보면 이 외에도 접근 권한 없음(403 오류), 서버 내부에 문제가 발생했음(500 오류) 등 다양한 오류들이 존재한다.

 

오류가 발생했을 때 해야할 작업을 별도로 지정하지 않으면 플라스크는 위 그림과 같이 기본으로 설정되어 있는 오류화면을 보여준다. 물론 오류 화면이기 때문에 서비스 범위라고 할 수 없지만 안내 문구나 좀 더 보기 좋은 디자인을 적용한 맞춤형 페이지를 대신 제공할 필요가 있을 수 있다.

 

 


 

 

맞춤형 오류 페이지는 웹 프로그래밍에 공통적으로 적용되는 주제는 아니다. 플라스크 패키지가 제공하는 기능에 해당하기 때문에 기능의 사용 방법을 바로 살펴보자.

 

먼저 아래와 실습 프로젝트 디렉토리를 생성하고 뷰에 해당하는 화면들을 준비한다. 여기서는 09_custom_error_pages라는 이름으로 예제 진행을 위한 디렉토리를 생성하였다.

 

실습을 위한 뷰 파일 생성

 

오류 페이지에 해당하는 뷰 파일들을 errors 디렉토리를 만들고 각각의 오류 코드 이름으로 403.html, 404.html, 500.html과 같이 생성하였다. 각 뷰 파일 내용은 오류가 발생했을 때 오류 내용을 설명하고 안내하는 내용을 기재하였다.

 

▶ templates/error/403.html

<!DOCTYPE html>
<html>
    <head>
        <meta charset="utf-8">
        <title>403 오류 맞춤 페이지</title>
    </head>
    <body>
        <h2>죄송합니다. 요청하신 페이지에 접근 권한이 없습니다.</h2>
        <p>로그인 되어 있는지, 페이지 접근 권한이 있는지 확인 부탁드립니다.</p>
    </body>
</html>

 

▶ templates/error/404.html

<!DOCTYPE html>
<html>
    <head>
        <meta charset="utf-8">
        <title>404 오류 맞춤 페이지</title>
    </head>
    <body>
        <h2>죄송합니다. 요청하신 페이지를 찾을 수가 없습니다.</h2>
        <p>URL 주소를 다시 한번 확인 부탁드립니다.</p>
    </body>
</html>

 

▶ templates/error/405.html

<!DOCTYPE html>
<html>
    <head>
        <meta charset="utf-8">
        <title>500 오류 맞춤 페이지</title>
    </head>
    <body>
        <h2>죄송합니다. 서버 내부에 오류가 발생했습니다.</h2>
        <p>서버 내부 오류로 인해 일시적인 장애가 발생했습니다.</p>
        <p>빠른 시간 안에 복구하고 정상적인 서비스를 제공하겠습니다.</p>
    </body>
</html>

 

home.html 파일은 웹 서비스의 홈 화면에 해당하는 뷰를 구성하는 파일이다. 웹 서비스에 처음 방문했을 때 보이는 화면에 해당한다.

 

▶ templates/home.html

<!DOCTYPE html>
<html>
    <head>
        <meta charset="utf-8">
        <title>메인 페이지</title>
    </head>
    <body>
        <h2>HTTP 오류 코드 종류</h2>
        <p>HTTP 오류 코드는 다양한 종류가 정의되어 있습니다</p>
        <p>가장 많이 볼 수 있는 404 오류는 요청한 페이지가 없을 때 발생합니다.</p>
        <p>403 오류는 요청한 페이지에 접근할 권한이 없을 때 발생합니다.</p>
        <p>500 오류는 서버 내부에 일시적인 문제가 발생했을 때 발생합니다.</p>
    </body>
</html>

 

이제 뷰 파일들을 사용자 요청에 따라 제공할 로직을 만들 차례다. 아래와 같이 프로젝트 디렉토리 바로 아래에 로직 파일을 작성한다.

 

로직 파일 작성

 

▶ run.py

from flask import Flask, Blueprint, render_template

#### Blueprint 객체가 맞춤형 오류 페이지 처리 기능을 제공한다.
#### 객체를 생성하고 이름을 error라고 설정하였다.
error = Blueprint('error', __name__)

#### Blueprint 객체의 app_errorhandler 메서드를 사용하여 403 오류를 처리하는 로직을 작성한다.
@error.app_errorhandler(403)
def error403(error):
    #### error 변수에는 플라스크가 기본적으로 제공하는 오류 메시지가 들어있다.
    #### 어떤 내용이 들어 있는지 한 번 출력해보자.
    print(error)
    
    #### 작성한 맞춤형 오류 페이지를 제공한다.
    return render_template('errors/403.html')

#### Blueprint 객체의 app_errorhandler 메서드를 사용하여 404 오류를 처리하는 로직을 작성한다.
@error.app_errorhandler(404)
def error404(error):
    print(error)
    return render_template('errors/404.html')

#### Blueprint 객체의 app_errorhandler 메서드를 사용하여 500 오류를 처리하는 로직을 작성한다.
@error.app_errorhandler(500)
def error500(error):
    print(error)
    return render_template('errors/500.html')

app = Flask(__name__)
app.register_blueprint(error)

#### 웹 서비스에 처음 방문했을 때 보여지는 메인 화면을 제공하는 로직을 작성한다.
@app.route("/")
@app.route("/home")
def home():
    return render_template('home.html')

#### 플라스크 웹 서버를 시작한다.
if __name__ == "__main__":
    app.run("127.0.0.1", 5000)

 

맞춤형 오류 페이지는 Blueprint 객체의 app_errorhandler() 파이썬 데코레이터를 이용해서 사용할 수 있다. 따라서 아래와 같이 먼저 Blueprint 객체를 생성하고 맞춤형 오류 처리 함수들을 설정한다.

error = Blueprint('error', __name__)

@error.app_errorhandler(403)
def error403(error):
    print(error)
    return render_template('errors/403.html')

@error.app_errorhandler(404)
def error404(error):
    print(error)
    return render_template('errors/404.html')

@error.app_errorhandler(500)
def error500(error):
    print(error)
    return render_template('errors/500.html')

 

다음으로 Blueprint 객체를 플라스크 객체에 등록하여 웹 서버에 통합하게 된다.

app = Flask(__name__)
app.register_blueprint(error)

 

 


 

 

이제 로직 파일 run.py를 실행시켜 웹 서버를 구동시킨 후 웹 브라우저를 이용해서 웹 서비스에 접속해보자. 아래와 같이 웹 서비스의 첫 화면이 나타날것이다.

 

웹 서비스 메인화면

 

웹 서비스에 존재하지 않는 페이지를 요청해보자. 아래와 같이 직접 작성한 오류 페이지가 제공될 것이다.

 

맞춤형 오류 페이지 - 404 오류

 

로직 코드에서 맞춤형 오류 처리 함수를 정의하면서 error 변수를 출력하도록 했었다. error 변수의 내용을 파이참 개발환경의 메시지 창을 통해 확인해 보면 아래와 같이 플라스크가 제공하는 기본 오류 메시지가 들어 있음을 볼 수 있다.

@error.app_errorhandler(404)
def error404(error):

    #### error 변수에는 기본 오류 메시지가 들어있다.
    print(error)
    
    return render_template('errors/404.html')

 

error 변수 출력결과 - 기본 오류 메시지: 404 Not Found: The requested URL ...