为Django站点添加Gravatar全球头像功能
2020-03-10     loonlog     3613     4
本文目录
Gravatar是Globally Recognized Avatar的缩写,是gravatar推出的一项服务,意为“全球通用头像”。如果在Gravatar的服务器上放置了你自己的头像,那么在任何支持Gravatar的blog或者留言本上留言时,只要提供你与这个头像关联的email地址,就能够显示出你的Gravatar头像来。
现在的主流博客框架,都已经使用了Gravatar全球通用头像功能,那我们使用django的朋友,也不能落后,必须也得国际化,本文就介绍在Django站点添加Gravatar全球头像功能。
过程比较简单,就是使用自定义模版标签建立一个gravatar_tags.py文件,然后再html文件中引用这个模板标签,并使用他。
官方开发文档:http://cn.gravatar.com/site/implement/images/django/
官方文档中的代码已经不适合django2.0和python3.0以上版本,直接使用报错:
报错1
Unicode-objects must be encoded before hashing
大致意思是必须指定要加密的字符串的字符编码,解决方法:代码中hashlib.md5(email.lower()) 改为hashlib.md5(email.lower().encode("utf-8"))
报错2
module 'urllib' has no attribute 'urlencode'
这个可能就是引入文件不对,解决方法:import urllib.request,urllib.error,urllib.parse
把代码中urllib.urlencode({'d':default, 's':str(size)})改为urllib.parse.urlencode({'d':default, 's':str(size)})
下面开始写代码
1、建立模板标签
在你的应用(app)文件夹下面templatetags文件夹中建立gravatar_tags.py文件,写入如下内容(更新后的代码)
import hashlib import urllib.request,urllib.error,urllib.parse 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 = "mm" return "https://www.gravatar.com/avatar/%s?%s" % (hashlib.md5(email.lower().encode("utf-8")).hexdigest(), urllib.parse.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))
这里再解释一个问题,官方示例中变量 default 为默认头像的固定 url,如果在迭代的过程中调用站点信息的话可能要耗费比较多的服务器资源;有人在 WordPress 中找到了调用官方预设头像的方法,开发者文档:https://en.gravatar.com/site/implement/images/
把default = "https://example.com/static/images/defaultavatar.jpg"改为default="mm",这样就会显示默认头像。
2、html文件中调用模版标签
这是一个过滤器的模板标签,在项目中使用 {{ email | gravatar_url:<size> }} 来调用头像的url,我的代码如下
{% load gravatar_tags %} <!-- 引入gravatar头像模版标签 --> {% for comment in comment_list %} <img class="gravatar" src="{{ comment.email|gravatar_url:60}}" /> <a class="nickname" id="comment_name_{{ comment.pk }}" href="{{ comment.url }}" rel="external nofollow ugc" target="_blank" >{{ comment.name }}</a> <time class="submit-date" datetime="{{ comment.created }}">{{ comment.created }}</time> <div class="plneirong" id="comment_{{ comment.pk }}">{{ comment.body|safe }}</div> {% empty %} 暂无评论 {% endfor %}
上面的代码大家主要关注下面这一行的使用方法即可(头像图片大小60*60px):
<img class="gravatar" src="{{ comment.email|gravatar_url:60}}" />
注意:时至今日,官方的https://www.gravatar.com/avatar头像源已经无法访问,貌似是需要科学上网才能用,因此,我们就更换一个国内的镜像源吧,地址是“https://cdn.v2ex.com/gravatar”,直接替换“https://www.gravatar.com/avatar”即可使用。
我一般办事前先搜索,当初在使用的时候也是在网上找了很多,这个版本还是比较简单的,也是官方推荐的开发方案,我也是搜到Jack's Blog的文章(https://jackyu.cn/tech/added-gravatar-to-django-project/#comment-429)之后才知道官方有开发文档。
http://loonlog.com/2020/3/10/django-gravatar/
评论列表,共 4 条评论
回复
越来越有点意思了,最近在练画,没怎么鼓捣,到你这学习学习
回复
可以,功能多,增加乐趣!
回复
官方的节点好像加载比较慢,我都换成v2ex的!
https://cdn.v2ex.com/gravatar
这rss提醒niec啊!!
回复
是的,但是我感觉我的可以呀,我暂时先不换,等等看再说。