2017-01-22 4 views
1

Я хочу использовать 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 %} 

им мой шаблон:

{{ user.email|gravatar:150 }} 

, но я получаю эту ошибку

Unicode-objects must be encoded before hashing 

ответ

2

user.email является строкой Unicode, в то время как хэш-функция может работать только на байт. Поэтому вам нужно преобразовать (то есть encode) строку в ряд байтов на основе некоторой кодировки символов Unicode.

Исторически адреса электронной почты были ограничены ASCII, но nowadays they can be UTF-8. В gravatar documentation не упоминается кодировка, поэтому неясно, поддерживают ли они адреса электронной почты UTF-8.

Простой ответ заключается в использовании email.lower().encode("utf-8"). Поскольку ASCII совпадает с UTF-8 во всем диапазоне ASCII, это должно работать для всех адресов электронной почты, которые поддерживает 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 

надеюсь, что это полезно ..

Смежные вопросы