もた日記

くだらないことを真面目にやる

Djangoメモ(35) : Gravatarを表示する独自テンプレートフィルタを作成

Python 3.6.4 Django 2.0.2

A Complete Beginner's Guide to Djangoのチュートリアルを参考にGravatarを表示する独自テンプレートフィルタを作成してみる。


Gravatar

Gravatarとは「グローバルに認識されるアバター」という意味でブログやコメントを投稿する際に名前の側に表示される画像のこと。
下記リンクで登録できる。

Gravatar - グローバルに認識されるアバター (Globally Recognized Avatars)

開発者向けのページには各言語でのコードサンプルがあり、Pythonでの実装例は下記コード。

# import code for encoding urls and generating md5 hashes
import urllib, hashlib
 
# Set your variables here
email = "someone@somewhere.com"
default = "https://www.example.com/default.jpg"
size = 40
 
# construct the url
gravatar_url = "https://www.gravatar.com/avatar/" + hashlib.md5(email.lower()).hexdigest() + "?"
gravatar_url += urllib.urlencode({'d':default, 's':str(size)})


独自テンプレートフィルタ

それでは独自テンプレートフィルタをboards/templatetags/gravatar.pyに作成してみる。

import hashlib
from urllib.parse import urlencode

from django import template
from django.conf import settings

register = template.Library()


@register.filter
def gravatar(user):
    email = user.email.lower().encode('utf-8')
    default = 'mm'
    size = 256
    url = 'https://www.gravatar.com/avatar/{md5}?{params}'.format(
        md5=hashlib.md5(email).hexdigest(),
        params=urlencode({'d': default, 's': str(size)})
    )
    return url

urlhttps://www.gravatar.com/avatar/e64d7d89f26bd1972efa854d13d7dd61?d=mm&s=256のような文字列になる。
これで|gravatarというフィルタが使えるようになったのでtemplates/topic_posts.htmlを以下のように編集する。

{% extends 'base.html' %}

{% load gravatar %}

{% block content %}
  <!-- code suppressed -->

  <img src="{{ post.created_by|gravatar }}" alt="{{ post.created_by.username }}" class="w-100 rounded">

  <!-- code suppressed -->
{% endblock %}

問題がなければ以下のようにGravatarが表示される。
ユーザーのEメール情報をもとにGravatarが表示されるので正しく表示されない場合はメールアドレスを要確認。

f:id:wonder-wall:20180401202544p:plain

なお、独自テンプレートタグ、フィルタの作成方法については下記記事を参照。

wonderwall.hatenablog.com


まとめ

  • Gravatarを表示する独自テンプレートフィルタを作成
  • {% load gravatar %}でロードして|gravatarフィルタを指定