|
16 | 16 | from apps.cms.models import ContentManageable, NameSlugModel |
17 | 17 | from apps.downloads.managers import ReleaseManager |
18 | 18 | from apps.pages.models import Page |
19 | | -from fastly.utils import purge_url |
| 19 | +from fastly.utils import purge_surrogate_key, purge_url |
20 | 20 |
|
21 | 21 | DEFAULT_MARKUP_TYPE = getattr(settings, "DEFAULT_MARKUP_TYPE", "markdown") |
22 | 22 |
|
@@ -288,38 +288,30 @@ def promote_latest_release(sender, instance, **kwargs): |
288 | 288 |
|
289 | 289 | @receiver(post_save, sender=Release) |
290 | 290 | def purge_fastly_download_pages(sender, instance, **kwargs): |
291 | | - """Purge Fastly caches so new Downloads show up more quickly.""" |
| 291 | + """Purge Fastly caches so new Downloads show up more quickly. |
| 292 | +
|
| 293 | + Uses surrogate key purging to clear ALL pages under /downloads/ in one request, |
| 294 | + including dynamically added pages like /downloads/android/, /downloads/ios/, etc. |
| 295 | + Falls back to individual URL purges if surrogate key purging is not configured. |
| 296 | + """ |
292 | 297 | # Don't purge on fixture loads |
293 | 298 | if kwargs.get("raw", False): |
294 | 299 | return |
295 | 300 |
|
296 | 301 | # Only purge on published instances |
297 | 302 | if instance.is_published: |
298 | | - # Purge our common pages |
299 | | - purge_url("/downloads/") |
300 | | - purge_url("/downloads/feed.rss") |
301 | | - purge_url("/downloads/latest/python2/") |
302 | | - purge_url("/downloads/latest/python3/") |
303 | | - # Purge minor version specific URLs (like /downloads/latest/python3.14/) |
304 | | - version = instance.get_version() |
305 | | - if instance.version == Release.PYTHON3 and version: |
306 | | - match = re.match(r"^3\.(\d+)", version) |
307 | | - if match: |
308 | | - purge_url(f"/downloads/latest/python3.{match.group(1)}/") |
309 | | - purge_url("/downloads/latest/prerelease/") |
310 | | - purge_url("/downloads/latest/pymanager/") |
311 | | - purge_url("/downloads/macos/") |
312 | | - purge_url("/downloads/source/") |
313 | | - purge_url("/downloads/windows/") |
| 303 | + # Purge all /downloads/* pages via surrogate key (preferred method) |
| 304 | + # This catches everything: /downloads/android/, /downloads/release/*, etc. |
| 305 | + purge_surrogate_key("downloads") |
| 306 | + |
| 307 | + # Also purge related pages outside /downloads/ |
314 | 308 | purge_url("/ftp/python/") |
315 | 309 | if instance.get_version(): |
316 | 310 | purge_url(f"/ftp/python/{instance.get_version()}/") |
317 | | - # See issue #584 for details |
| 311 | + # See issue #584 for details - these are under /box/, not /downloads/ |
318 | 312 | purge_url("/box/supernav-python-downloads/") |
319 | 313 | purge_url("/box/homepage-downloads/") |
320 | 314 | purge_url("/box/download-sources/") |
321 | | - # Purge the release page itself |
322 | | - purge_url(instance.get_absolute_url()) |
323 | 315 |
|
324 | 316 |
|
325 | 317 | @receiver(post_save, sender=Release) |
|
0 commit comments