Skip to content

Commit f40b171

Browse files
jaap3berkerpeksag
authored andcommitted
Refactor purge_url() (#1340)
* Allow multiple URLs to be purged at once. * Use urllib.parse.urljoin() instead of format so the paths can omit the leading slash. * Use a request session to purge URLs. This should reduce the overhead of opening up a connection for each URL to purge. * Rename purge_url() to purge_urls().
1 parent 22df4f4 commit f40b171

File tree

5 files changed

+39
-37
lines changed

5 files changed

+39
-37
lines changed

downloads/models.py

+17-15
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@
1212

1313
from boxes.models import Box
1414
from cms.models import ContentManageable, NameSlugModel
15-
from fastly.utils import purge_url
15+
from fastly.utils import purge_urls
1616
from pages.models import Page
1717

1818
from .managers import ReleaseManager
@@ -242,21 +242,23 @@ def purge_fastly_download_pages(sender, instance, **kwargs):
242242

243243
# Only purge on published instances
244244
if instance.is_published:
245-
# Purge our common pages
246-
purge_url('/downloads/')
247-
purge_url('/downloads/latest/python2/')
248-
purge_url('/downloads/latest/python3/')
249-
purge_url('/downloads/mac-osx/')
250-
purge_url('/downloads/source/')
251-
purge_url('/downloads/windows/')
245+
purge_urls(
246+
# Purge our common pages
247+
'/downloads/',
248+
'/downloads/latest/python2/',
249+
'/downloads/latest/python3/',
250+
'/downloads/mac-osx/',
251+
'/downloads/source/',
252+
'/downloads/windows/',
253+
# See issue #584 for details
254+
'/box/supernav-python-downloads/',
255+
'/box/homepage-downloads/',
256+
'/box/download-sources/',
257+
# Purge the release page itself
258+
instance.get_absolute_url(),
259+
)
252260
if instance.get_version() is not None:
253-
purge_url('/ftp/python/{}/'.format(instance.get_version()))
254-
# See issue #584 for details
255-
purge_url('/box/supernav-python-downloads/')
256-
purge_url('/box/homepage-downloads/')
257-
purge_url('/box/download-sources/')
258-
# Purge the release page itself
259-
purge_url(instance.get_absolute_url())
261+
purge_urls('/ftp/python/{}/'.format(instance.get_version()))
260262

261263

262264
@receiver(post_save, sender=Release)

fastly/utils.py

+11-13
Original file line numberDiff line numberDiff line change
@@ -1,22 +1,20 @@
1+
import urllib.parse
2+
13
import requests
24

35
from django.conf import settings
46

57

6-
def purge_url(path):
8+
def purge_urls(*paths):
79
"""
8-
Purge a Fastly.com URL given a path. path argument must begin with a slash
10+
Purge Fastly cache for each given path.
911
"""
10-
if settings.DEBUG:
11-
return
12-
1312
api_key = getattr(settings, 'FASTLY_API_KEY', None)
14-
if api_key:
15-
response = requests.request(
16-
'PURGE',
17-
'https://www.python.org{}'.format(path),
18-
headers={'Fastly-Key': api_key},
19-
)
20-
return response
13+
if not api_key or settings.DEBUG:
14+
return
2115

22-
return None
16+
with requests.session() as session:
17+
session.headers['Fastly-Key'] = api_key
18+
for path in paths:
19+
url = urllib.parse.urljoin('https://www.python.org', path)
20+
session.request('PURGE', url)

jobs/models.py

+6-4
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@
1111
from markupfield.fields import MarkupField
1212

1313
from cms.models import ContentManageable, NameSlugModel
14-
from fastly.utils import purge_url
14+
from fastly.utils import purge_urls
1515

1616
from .managers import JobQuerySet, JobTypeQuerySet, JobCategoryQuerySet
1717
from .signals import (
@@ -263,6 +263,8 @@ def purge_fastly_cache(sender, instance, **kwargs):
263263
return
264264

265265
if instance.status == Job.STATUS_APPROVED:
266-
purge_url(reverse('jobs:job_detail', kwargs={'pk': instance.pk}))
267-
purge_url(reverse('jobs:job_list'))
268-
purge_url(reverse('jobs:job_rss'))
266+
purge_urls(
267+
reverse('jobs:job_detail', kwargs={'pk': instance.pk}),
268+
reverse('jobs:job_list'),
269+
reverse('jobs:job_rss'),
270+
)

pages/models.py

+2-2
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@
1818
from markupfield.fields import MarkupField
1919

2020
from cms.models import ContentManageable
21-
from fastly.utils import purge_url
21+
from fastly.utils import purge_urls
2222

2323
from .managers import PageQuerySet
2424

@@ -86,7 +86,7 @@ def purge_fastly_cache(sender, instance, **kwargs):
8686
Purge fastly.com cache if in production and the page is published.
8787
Requires settings.FASTLY_API_KEY being set
8888
"""
89-
purge_url('/{}'.format(instance.path))
89+
purge_urls(instance.path)
9090

9191

9292
def page_image_path(instance, filename):

successstories/models.py

+3-3
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@
1414
from boxes.models import Box
1515
from cms.models import ContentManageable, NameSlugModel
1616
from companies.models import Company
17-
from fastly.utils import purge_url
17+
from fastly.utils import purge_urls
1818

1919

2020
PSF_TO_EMAILS = ['[email protected]']
@@ -109,11 +109,11 @@ def update_successstories_supernav(sender, instance, created, **kwargs):
109109
)
110110

111111
# Purge Fastly cache
112-
purge_url('/box/supernav-python-success-stories/')
112+
purge_urls('/box/supernav-python-success-stories/')
113113

114114
if instance.is_published:
115115
# Purge the page itself
116-
purge_url(instance.get_absolute_url())
116+
purge_urls(instance.get_absolute_url())
117117

118118

119119
@receiver(post_save, sender=Story)

0 commit comments

Comments
 (0)