1. 아바타를 위한 User의 avatar 메서드 만들기
# vim app/models.py
# ...
class User(UserMinin, db.Model):
# ...
# 아바타 url의 이미지 size(픽셀)로 조정해 return, 아바타가 등록되지 않은 사용자의 경우 identicon 이미지가 생성됨
# MD5 해시 생성을 위해 이메일을 소문자로 변환한 후 문자열을 바이트로 인코딩해줌 - python의 MD5는 문자열이 아니라 바이트에서 작동하기 때문이다.
def avatar(self, size):
digest = md5(self.email.lower().encode('utf-8')).hexdigest()
return 'https://www.gravatar.com/avatar/{}?d=identicon&s={}'.format(
digest, size)
# ...
2. 사용자 아바타 출력 & 게시물의 사용자 아바타 출력
<!-- vim app/templates/user.html -->
{% extends "base.html" %}
{% block content %}
<table>
<tr valign="top">
<td><img src="{{ user.avatar(128) }}"></td>
<td><h1>User: {{ user.username }}</h1></td>
</tr>
</table>
<hr>
{% for post in posts %}
<table>
<tr valign="top">
<td><img src="{{ post.author.avatar(36) }}"></td>
<td>{{ post.author.username }} says:<br>{{ post.body }}</td>
</tr>
</table>
{% endfor %}
{% endblock %}
3. 하위 템플릿 사용
<!-- vim app/templates/_post.html -->
<!-- 포스트 서브 템플릿 생성 -->
<table>
<tr valign="top">
<td><img src="{{ post.author.avatar(36) }}"></td>
<td>{{ post.author.username }} says:<br>{{ post.body }}</td>
</tr>
</table>
include를 활용해 user.html의 하위 템플릿인 _post.html 호출
<!-- vim app/templates/user.html -->
{% extends "base.html" %}
{% block content %}
<table>
<tr valign="top">
<td><img src="{{ user.avatar(128) }}"></td>
<td><h1>User: {{ user.username }}</h1></td>
</tr>
</table>
<hr>
{% for post in posts %}
<!-- post 서브 템플릿 사용 -->
{% include '_post.html' %}
{% endfor %}
{% endblock %}
4. 사용자 모델의 새로운 필드 추가 - 추가정보 & 마지막 접속 시간
# vim app/models.py
# ...
class User(UserMixin, db.Model):
# ...
# 사용자의 추가 정보 컬럼 만들기
about_me = db.Column(db.String(140))
# 마지막으로 사이트에 access한 시간 추적 컬럼 만들기
last_seen = db.Column(db.DateTime, default=datetime.utcnow)
# ...
5. 추가된 DB migrate하여 update하기
$ flask db migrate -m "new fields in user model : more_information & last connect"
$ flask db upgrade
필드가 추가되었기 때문에 flask db migrate & flask upgrade를 진행해줘야합니다!

6. 사용자의 프로필 템플릿에 사용자 정보 표시
<!-- vim app/template/user.html -->
{% extends "base.html" %}
{% block content %}
<table>
<tr valign="top">
<td><img src="{{ user.avatar(128) }}"></td>
<!-- 유저명에 + 유저 정보와 마지막 접속 시간 정보 출력 -->
<td>
<h1>User: {{ user.username }}</h1></td>
{% if user.about_me %}<p>{{ user.about_me }}</p>{% endif %}
{% if user.last_seen %}<p>Last seen on : {{ user.last_seen }}</p>{% endif %}
</td>
</tr>
</table>
<!-- ... -->
7. !!! datetime 짚고가기 !!!
그동안 datetime 에 대하여 단순히 datetime.now()를 사용했는데, 이 방법은 결코 좋은 방법이 아님을 알아 수정하도록 하겠습니다.
# vim app/models.py
import datetime
datetime_kor = datetime.datetime.utcnow() + datetime.timedelta(hours=9)
현재 시간을 가져올 때마다 한국 시간을 가져오도록 수정합니다.
import datetime으로 변경합니다.
한국 시간은 utc보다 9시간 늦기 때문에 이와 같이 설정합니다.

8. 마지막 방문 시간 기록
# vim app/routes.py
# ...
import datetime
# ...
# 마지막 방문 시간 기록
# request 되기 전에, 즉 웹페이지 view가 출력되기 전에 실행하려는 코드를 이곳에 삽입해두면 매우 유용하다.
@app.before_request
def before_request():
if current_user.is_authenticated:
# 미국 시간의 9시간 뒤 = 한국 시간
current_user.last_seen = datetime.datetime.utcnow() + datetime.timedelta(hours=9)
db.session.commit()