Jacky's Blog Jacky's Blog
  • 首页
  • 关于
  • 项目
  • 大事记
  • 留言板
  • 友情链接
  • 分类
    • 干货
    • 随笔
    • 项目
    • 公告
    • 纪念
    • 尝鲜
    • 算法
    • 深度学习
  • 0
  • 3

Django 接入 Gravatar

Jacky
14 8 月, 2017

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

Django 接入 Gravatar-Jacky's Blog

只需要这样写就可以了: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日

0
ECShop 后台 SQL 注入漏洞
上一篇
一周年
下一篇

评论 (3)

再想想
  • 菜鸟之志

    非常感谢,我的版本是最新的python3.7,django2.2,运行有错误,但是谢谢,你这个是最好的方法,等等我把对应的新版的代码页也写个博客!

    5 年前
    • Jacky

      @菜鸟之志: 噢 这个方案是djingo 1.x 的 好久没写了😅 就没更新

      5 年前
  • 小响

    多谢! 😛

    7 年前

近期评论

  • Jacky 发表在《留言板》
  • 菜鸟 发表在《留言板》
  • merlin 发表在《留言板》
  • orz 发表在《Xcode 中使用 Clang-format》
  • Jacky 发表在《关于》
3
Copyright © 2016-2025 Jacky's Blog. Designed by nicetheme.
粤ICP备16016168号-1
  • 首页
  • 关于
  • 项目
  • 大事记
  • 留言板
  • 友情链接
  • 分类
    • 干货
    • 随笔
    • 项目
    • 公告
    • 纪念
    • 尝鲜
    • 算法
    • 深度学习

搜索

  • Mac
  • Apple
  • OS X
  • iOS
  • macOS
  • Linux
  • 阿里云
  • WordPress
  • 运维
  • macOS Sierra

Jacky

Go Python C C++ | 弱冠之年 | 物联网工程
183
文章
192
评论
267
喜欢