2017-01-22 64 views
1

之前進行編碼我想在Django上使用的gravatar:Unicode的對象必須散列

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 %} 

IM我的模板:

{{ user.email|gravatar:150 }} 

,但我得到這個錯誤

Unicode-objects must be encoded before hashing 

回答

2

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

你使用Python 3的權利嗎?這是因爲您需要將電子郵件編碼爲utf-8,例如email.encode('utf-8')。 here'is我使用的是什麼我目前的項目...

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 

希望它有用..

相關問題