必须在散列之前对Unicode对象进行编码

时间:2017-01-22 11:42:54

标签: django gravatar

我想在django上使用gravatar:

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))

我正在使用此链接: Django gravatar

我把这段代码放在一个名为'grav_tag'的文件中 并加载:

{% load  grav_tag %}

我的模板:

{{ user.email|gravatar:150 }}

但我收到此错误

Unicode-objects must be encoded before hashing

2 个答案:

答案 0 :(得分:4)

user.email是一个Unicode字符串,而散列函数只能对字节进行操作。因此,您需要根据某些Unicode字符编码将字符串转换(即encode)一系列字节。

从历史上看,电子邮件地址仅限于ASCII,但nowadays they can be UTF-8也是如此。 gravatar documentation未提及编码,因此不清楚它们是否支持UTF-8电子邮件地址。

简单的答案就是使用email.lower().encode("utf-8")。由于ASCII在整个ASCII范围内与UTF-8相同,因此这适用于Gravatar支持的所有电子邮件地址。

答案 1 :(得分:1)

你现在正在使用Python 3吗?这是因为您需要将电子邮件编码为utf-8,例如email.encode('utf-8')。这是我用于目前项目的内容......

import hashlib
from django import template

try:
    # Python 3
    from urllib.parse import urlencode
except ImportError:
    # Python 2
    from urllib import urlencode

register = template.Library()

@register.filter
def gravatar(email, size="75"):
    """
    <img src='{{ request.user.email|gravatar:"75" }}'>
    """
    gravatar_url = "//www.gravatar.com/avatar/" + \
        hashlib.md5(email.encode('utf-8')).hexdigest() + "?"
    gravatar_url += urlencode({'d': 'retro', 's': str(size)})
    return gravatar_url

希望它有用..