2017-01-22 11 views
1

Je veux utiliser Gravatar sur django:objets Unicode-doivent être codés avant hachant

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

J'utilise ce lien: Django gravatar

Je mets ce code dans un fichier appelé 'grav_tag' et charger avec:

{% load grav_tag %} 

im mon modèle:

{{ user.email|gravatar:150 }} 

mais je reçois cette erreur

Unicode-objects must be encoded before hashing 

Répondre

2

user.email est une chaîne Unicode, alors que la fonction de hachage ne peut fonctionner que sur des octets. Vous devez donc convertir (c'est-à-dire encode) la chaîne en une série d'octets, en fonction de l'encodage de caractères Unicode.

Historiquement, les adresses électroniques étaient limitées à l'ASCII, mais également au nowadays they can be UTF-8. Le gravatar documentation ne mentionne pas un encodage, donc il n'est pas clair si elles prennent en charge les adresses e-mail UTF-8. La réponse simple est juste d'utiliser email.lower().encode("utf-8"). Comme ASCII est le même que UTF-8 dans toute la gamme ASCII, cela devrait fonctionner pour toutes les adresses email prises en charge par Gravatar.

1

Utilisez-vous Python 3 en ce moment? Parce que vous devez encoder votre email comme utf-8, exemple email.encode('utf-8'). here'is ce que j'utilise pour mon projet actuellement ...

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 

espère qu'il .. utile