【问题标题】:Unicode-objects must be encoded before hashingUnicode 对象必须在散列之前进行编码
【发布时间】:2017-01-22 11:42:53
【问题描述】:

我想在 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

【问题讨论】:

    标签: django gravatar


    【解决方案1】:

    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 支持的所有电子邮件地址。

    【讨论】:

      【解决方案2】:

      您现在使用的是 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
      

      希望有用..

      【讨论】:

        猜你喜欢
        • 2016-10-12
        • 1970-01-01
        • 2020-03-25
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-07-16
        相关资源
        最近更新 更多