Cache some Gravatar results (failed fetch + default to reduce the number of requests and therfore roundtrip

This commit is contained in:
Oliver Falk
2020-03-04 13:35:07 +01:00
parent 310da97d1c
commit 07ba1c5a05

View File

@@ -10,6 +10,7 @@ from ssl import SSLError
from django.views.generic.base import TemplateView, View from django.views.generic.base import TemplateView, View
from django.http import HttpResponse, HttpResponseRedirect, HttpResponseNotFound from django.http import HttpResponse, HttpResponseRedirect, HttpResponseNotFound
from django.core.exceptions import ObjectDoesNotExist from django.core.exceptions import ObjectDoesNotExist
from django.core.cache import cache
from django.utils.translation import ugettext_lazy as _ from django.utils.translation import ugettext_lazy as _
from django.urls import reverse_lazy from django.urls import reverse_lazy
from django.db.models import Q from django.db.models import Q
@@ -147,8 +148,6 @@ class AvatarImageView(TemplateView):
+ '?s=%i' % size + '&default=%s&f=y' % default + '?s=%i' % size + '&default=%s&f=y' % default
return HttpResponseRedirect(url) return HttpResponseRedirect(url)
if str(default) == str(404): if str(default) == str(404):
return HttpResponseNotFound(_('<h1>Image not found</h1>')) return HttpResponseNotFound(_('<h1>Image not found</h1>'))
@@ -291,10 +290,14 @@ class GravatarProxyView(View):
# redirect to our default instead. # redirect to our default instead.
gravatar_test_url = 'https://secure.gravatar.com/avatar/' + kwargs['digest'] \ gravatar_test_url = 'https://secure.gravatar.com/avatar/' + kwargs['digest'] \
+ '?s=%i' % 50 + '?s=%i' % 50
if cache.get(gravatar_test_url) == 'default':
print("Cached Gravatar response: Default.")
return redir_default(default)
try: try:
testdata = urlopen(gravatar_test_url, timeout=URL_TIMEOUT) testdata = urlopen(gravatar_test_url, timeout=URL_TIMEOUT)
data = BytesIO(testdata.read()) data = BytesIO(testdata.read())
if hashlib.md5(data.read()).hexdigest() == '71bc262d627971d13fe6f3180b93062a': if hashlib.md5(data.read()).hexdigest() == '71bc262d627971d13fe6f3180b93062a':
cache.set(gravatar_test_url, 'default', 60)
return redir_default(default) return redir_default(default)
except Exception as exc: except Exception as exc:
print('Gravatar test url fetch failed: %s' % exc) print('Gravatar test url fetch failed: %s' % exc)
@@ -303,22 +306,29 @@ class GravatarProxyView(View):
+ '?s=%i' % size + '&d=%s' % default + '?s=%i' % size + '&d=%s' % default
try: try:
if cache.get(gravatar_url) == 'err':
print('Cached Gravatar fetch failed with URL error')
return redir_default(default)
gravatarimagedata = urlopen(gravatar_url, timeout=URL_TIMEOUT) gravatarimagedata = urlopen(gravatar_url, timeout=URL_TIMEOUT)
except HTTPError as exc: except HTTPError as exc:
if exc.code != 404 and exc.code != 503: if exc.code != 404 and exc.code != 503:
print( print(
'Gravatar fetch failed with an unexpected %s HTTP error' % 'Gravatar fetch failed with an unexpected %s HTTP error' %
exc.code) exc.code)
cache.set(gravatar_url, 'err', 30)
return redir_default(default) return redir_default(default)
except URLError as exc: except URLError as exc:
print( print(
'Gravatar fetch failed with URL error: %s' % 'Gravatar fetch failed with URL error: %s' %
exc.reason) exc.reason)
cache.set(gravatar_url, 'err', 30)
return redir_default(default) return redir_default(default)
except SSLError as exc: except SSLError as exc:
print( print(
'Gravatar fetch failed with SSL error: %s' % 'Gravatar fetch failed with SSL error: %s' %
exc.reason) exc.reason)
cache.set(gravatar_url, 'err', 30)
return redir_default(default) return redir_default(default)
try: try:
data = BytesIO(gravatarimagedata.read()) data = BytesIO(gravatarimagedata.read())