2017-01-22 2 views
1

をハッシュ前に符号化されなければならない私は、Djangoの上でグラバター使いたい:ユニコード・オブジェクトは

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

イム私のテンプレート:

をしててロードします3210
{{ 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 

は、ハッシュ関数はバイトのみを操作することができ、一方、

関連する問題