Gravatar 是 Globally Recognized Avatar 的缩写,是 Gravatar 推出的一项服务,意为“全球通用头像”。如果在Gravatar 中上传了自己的头像,那么在任何支持 Gravatar 的 网站上留言时,只要提供你与这个头像关联的 E-mail 地址,就能够显示出你的头像。
0x01. Django app 接入 Gravatar
官方文档给出的示例:http://cn.gravatar.com/site/implement/images/django/
import hashlib
import urllib
from django import template
from django.utils.safestring import mark_safe
register = template.Library()
# return only the URL of the gravatar
# TEMPLATE USE: {{ email|gravatar_url:150 }}
@register.filter
def gravatar_url(email, size=40):
default = "https://example.com/static/images/defaultavatar.jpg"
return "https://www.gravatar.com/avatar/%s?%s" % (hashlib.md5(email.lower()).hexdigest(), urllib.urlencode({'d':default, 's':str(size)}))
# return an image tag with the gravatar
# TEMPLATE USE: {{ email|gravatar:150 }}
@register.filter
def gravatar(email, size=40):
url = gravatar_url(email, size)
return mark_safe('<img src="%s" height="%d" width="%d">' % (url, size, size))
0x02. 如何调用
这是一个过滤器的模板标签,你可以先在 templatetags/ 中创建一个 gravatar.py 并使用官方示例,然后再在项目中使用 {{ email | gravatar_url:<size> }}
来调用头像 url
示例:
{% load i18n staticfiles gravatar %}
{% if comment.user_email %}</code></pre>
<div class="comments-context">
<div class="gravatar"><img src="{{ comment.user_email|gravatar_url:128}}" /></div>
{% endif %}<div{% if preview %} id="comment-preview"{% else %} id="c{{ comment.id }}"{% endif %} class="comment-item">;
{% block comment_item %} {% if preview %}
<h3>{% trans "Preview of your comment" %}</h3>
{% endif %}
<h4>{% block comment_title %} {% if comment.url %}<a href="{{ comment.url }}" rel="nofollow">{% endif %} {% if comment.name %}</a></h4>
<p class="comment_name">{{ comment.name }}</p>
{% else %}{% trans "Anonymous" %}{% endif %}{% comment %} {% endcomment %}{% if comment.url %}{% endif %} <span class="comment-date">{% blocktrans with submit_date=comment.submit_date %}on {{ submit_date }}{% endblocktrans %}</span> {% if not comment.is_public %}<span class="comment-moderated-flag">({% trans "moderated" %})</span>{% endif %} {% if USE_THREADEDCOMMENTS and not preview %}<a class="comment-reply-link" href="#c{{ comment.id }}" data-comment-id="{{ comment.id }}">{% trans "reply" %}</a>{% endif %} {% endblock %}
<div class="comment-text">{{ comment.comment|linebreaks }}</div>
{% endblock %}
0x03. 改进
官方示例中变量 default 为默认头像的固定 url,如果在迭代的过程中调用站点信息的话可能要耗费比较多的服务器资源
偶然间在 WordPress 中找到了调用官方预设头像的方法,开发者文档:https://en.gravatar.com/site/implement/images/
我用的是 mm
只需要这样写就可以了:default="mm"
这样当 Gravatar 查不到这个邮箱的头像时,就会返回你设置的默认头像了。
然而又有个新问题,在中国 Gravatar 的速度是十分感人的,最终我们选择了 V2EX 的镜像站点。
下面是改进后的代码
import hashlib
import urllib
from django import template
from DCRM.settings import LANGUAGE_CODE #获取 settings.py 设置的语言
register = template.Library()
# return only the URL of the gravatar
# TEMPLATE USE: {{ email|gravatar_url:150 }}
@register.filter
def gravatar_url(email, size=128):
# Optimize for Chinese
url = "https://cdn.v2ex.com/gravatar/" if LANGUAGE_CODE == 'zh-hans' else "https://www.gravatar.com/avatar/" #语言为中文则调用 v2ex 反之则调用官方站点😂
# default image, doc: https://en.gravatar.com/site/implement/images/
default = 'mm'
return url + "%s?%s" % (hashlib.md5(email.lower()).hexdigest(), urllib.urlencode({'d': default, 's': str(size)}))
文章最后修订于 2018年9月17日
非常感谢,我的版本是最新的python3.7,django2.2,运行有错误,但是谢谢,你这个是最好的方法,等等我把对应的新版的代码页也写个博客!
@菜鸟之志: 噢 这个方案是djingo 1.x 的 好久没写了😅 就没更新
多谢! 😛