Unicode 对象必须在散列之前编码
Unicode-objects must be encoded before hashing
我想在 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))
我正在使用这个 link:
Django gravatar
我把这段代码放在一个名为 'grav_tag' 的文件中
并加载:
{% load grav_tag %}
我的模板是:
{{ user.email|gravatar:150 }}
但是我收到这个错误
Unicode-objects must be encoded before hashing
您现在正在使用 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
希望有用..
user.email
是Unicode字符串,而哈希函数只能对字节进行操作。因此,您需要根据某些 Unicode 字符编码将字符串转换(即 encode)为一系列字节。
过去,电子邮件地址仅限于 ASCII,但 nowadays they can be UTF-8 as well. The gravatar documentation 未提及编码,因此不清楚它们是否支持 UTF-8 电子邮件地址。
简单的答案就是使用 email.lower().encode("utf-8")
。由于 ASCII 在整个 ASCII 范围内与 UTF-8 相同,因此这应该适用于 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))
我正在使用这个 link: Django gravatar
我把这段代码放在一个名为 'grav_tag' 的文件中 并加载:
{% load grav_tag %}
我的模板是:
{{ user.email|gravatar:150 }}
但是我收到这个错误
Unicode-objects must be encoded before hashing
您现在正在使用 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
希望有用..
user.email
是Unicode字符串,而哈希函数只能对字节进行操作。因此,您需要根据某些 Unicode 字符编码将字符串转换(即 encode)为一系列字节。
过去,电子邮件地址仅限于 ASCII,但 nowadays they can be UTF-8 as well. The gravatar documentation 未提及编码,因此不清楚它们是否支持 UTF-8 电子邮件地址。
简单的答案就是使用 email.lower().encode("utf-8")
。由于 ASCII 在整个 ASCII 范围内与 UTF-8 相同,因此这应该适用于 Gravatar 支持的所有电子邮件地址。