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()

 

 

 

+ Recent posts