Custom Error Pages


Flask에서는 Application에서 정의 할 수 있는 Custom Error Page를 작성할 수 있다. 두개의 가장 일반적인 에러는 404와 500 에러이다. 404에러는 client에서 요청한 page나 route를 알수 없을 때 이며, 500은 unhandled exception이 발생했을 때이다.


bootstrap과 같은 형태의 에러페이지를 보여주기 위하여 user.html와 같은 base.html을 작성하고 이를 활용하여 error page를 작성한다. 이후 base.html을 상속 받아 사용하면 쉽게 다른 페이지들을 만들 수 있다.


template/base.html

{% extends "bootstrap/base.html" %}

{% block title %}Flasky{% endblock %}

{% block navbar %}

#......

{% endblock %}

{% block content %}

<div class="container">

{% block page_content %}{% endblock %}

</div>

{% endblock %}


template/404.html

{% extends "base.html" %}

{% block page_content %}

<div class="page-header">

<h1>Not Found</h1>

</div>

{% endblock %}


user.html도 base.html을 이용하여 아래와 같이 바꿀 수 있다.

{% extends "base.html" %}

{% block title %}Flasky{% endblock %}

{% block page_content %}

<div class="page-header">

<h1>Hello, {{ name }}~</h1>

</div>

{% endblock %}


Links

페이지 링크는 template나 view function을 이용하여 넣을 수 있지만 이럴 경우 dynamic한 link를 지원하기 힘들다. url_for를 사용하여 이러한 dynamic link를 지원할 수 있다.

url_for('user', name='john', _external=True)  # http://localhost:5000/user/john

url_for('index', page=2)  # /?page=2


Static Files

icon, css파일이나 javascript 파일 등 static 파일들은 기본적으로(default) flask root의 static 폴더에 위치한다.

template에서 이러하나 파일에 접근할 때도 url_for을 사용하여 쉽게 접근할 수 있다.



Location of Dates and Times with Flask-Moment

서버에서 시간을 다루는 문제는 사소한 문제가 아니다. 일반적으로 서버시간은 UTC(Coodrinated Universal Time)을 사용한다. 하지만, 사용자들은 각자의 local time을 보기를 원한다. 우아한(elegant)한 해결책은 서버에서 UTC를 제공하면 Client의 Web Browser에서 local time으로 변환해 표시하는 것이다. Web Browser는 사용자 컴퓨터의 time zone과 local setting에 접근할 수 있기 때문에 더 정확하게 할 수 있다. javascript에서는 moment.js라는 훌륭한 library로 이를 해결할 수있는데 Flask에서 이를 활용한 Flask-Moment를 Jinja2 Template에서 지원한다.

(venv)$pip install flask-moment


다음과 같이 initialization 한다.

from flask.ext.moment import Moment

moment = Moment(app)


Flask-Moment는 jquery.js와 moment.js를 필요로(depend)한다. Bootstrap에 jquery는 포함되어 있으므로 moment script를 추가해 준다. template/base.html에 다음과 같이 moment를 추가 한다. 

{% block scripts %}

{{ super() }}

{{ moment.include_moment() }}

{% endblock %}

주의 할점은 super()를 사용해 script를 상속 받아 사용해야 한다는 것이다. 이전의 것을 전부 지우지 않도록 한다.


hello.py에서는 current time을 추가한다.

from datetime import datetime


@app.route('/')

def index():

return render_template('index.html', current_time=datetime.utcnow())


template/index.html

{% extends "base.html" %}


{% block page_content %}

<h1>Hello World!</h1>

<p>The local date and time is {{ moment(current_time).format('LLL') }}.</p>

<p>That was {{ moment(current_time).fromNow(refresh=True) }}</p>

{% endblock %}


format('LLL')은 사용자 컴퓨터의 time zone과 local setting에 따른 포멧이다. fromNow()는 자동적으로 시간이 얼마나 흘렀는지를 보여준다. 처음에는 'a few seconds ago'를 보여주지만 시간이 지나면 아래와 같이 지난 시간을 보여준다.


Flask-Moment에서는 moment.js로 부터 format(), fromNow(), fromTime(), calendar(), valueOf(), unix() 메소드를 구현하였다. (moment.js: http://momentjs.com/)

Flask-Moment는 다양한 언어도 지원한다. 

{{ moment.lang('es') }}


저작자 표시 비영리 변경 금지
신고
Posted by GMP Mate 빨간 양말

댓글을 달아 주세요