Giriş

Bu bölümde kullanıcı profil sayfaları oluşturulacak, Gravatar servisi ile avatar desteği eklenecek, Jinja alt şablonları kullanılacak ve kullanıcıların profil bilgilerini düzenleyebileceği bir form geliştirilecek.

Kullanıcı Profil Sayfası

app/routes.py Dosyasına Profil View Fonksiyonunu Ekle

@app.route('/user/<username>')
@login_required
def user(username):
    user = db.first_or_404(sa.select(User).where(User.username == username))
    posts = [
        {'author': user, 'body': 'Test post #1'},
        {'author': user, 'body': 'Test post #2'}
    ]
    return render_template('user.html', user=user, posts=posts)

app/templates/user.html Dosyasını Oluştur

{% extends "base.html" %}

{% block content %}
    <h1>User: {{ user.username }}</h1>
    <hr>
    {% for post in posts %}
    <p>
    {{ post.author.username }} says: <b>{{ post.body }}</b>
    </p>
    {% endfor %}
{% endblock %}

Navigasyon Çubuğuna Profil Bağlantısı Ekle (app/templates/base.html)

<div>
    Microblog:
    <a href="{{ url_for('index') }}">Home</a>
    {% if current_user.is_anonymous %}
    <a href="{{ url_for('login') }}">Login</a>
    {% else %}
    <a href="{{ url_for('user', username=current_user.username) }}">Profile</a>
    <a href="{{ url_for('logout') }}">Logout</a>
    {% endif %}
</div>

Avatarlar (Gravatar)

Sunucuda görsel saklamak yerine Gravatar servisi kullanılır. Gravatar, e-posta adresinin MD5 hash'i ile URL oluşturur.

>>> from hashlib import md5
>>> '<https://www.gravatar.com/avatar/>' + md5(b'john@example.com').hexdigest()
'<https://www.gravatar.com/avatar/d4c74594d841139328695756648b6bd6>'

app/models.py Dosyasına avatar() Metodunu Ekle

from hashlib import md5

class User(UserMixin, db.Model):
    # ...
    def avatar(self, size):
        digest = md5(self.email.lower().encode('utf-8')).hexdigest()
        return f'<https://www.gravatar.com/avatar/{digest}?d=identicon&s={size}>'