Просмотр исходного кода

Move request to background task

Sander Steffann 6 лет назад
Родитель
Сommit
8ce106cb4b
2 измененных файлов с 55 добавлено и 26 удалено
  1. 40 0
      netbox/utilities/background_tasks.py
  2. 15 26
      netbox/utilities/releases.py

+ 40 - 0
netbox/utilities/background_tasks.py

@@ -0,0 +1,40 @@
+import logging
+
+import requests
+from cacheops import cache
+from django.conf import settings
+from django_rq import job
+from packaging import version
+
+# Get an instance of a logger
+logger = logging.getLogger(__name__)
+
+
+@job
+def get_releases(pre_releases=False):
+    url = '{}/releases'.format(settings.UPDATE_REPO_URL)
+    headers = {
+        'Accept': 'application/vnd.github.v3+json',
+    }
+
+    releases = []
+
+    # noinspection PyBroadException
+    try:
+        response = requests.get(url, headers=headers)
+        for release in response.json():
+            if 'tag_name' not in release:
+                continue
+
+            if not pre_releases and (release.get('is_devrelease') or release.get('is_prerelease')):
+                continue
+
+            releases.append((version.parse(release['tag_name']), release.get('html_url')))
+    except Exception:
+        logger.exception("Error while fetching {}".format(url))
+        return []
+
+    logger.debug("Found NetBox releases {}".format([str(release) for release, url in releases]))
+
+    cache.set('netbox_releases', releases, settings.UPDATE_CACHE_TIMEOUT)
+    return releases

+ 15 - 26
netbox/utilities/releases.py

@@ -1,35 +1,24 @@
-import requests
-from cacheops import cached
-from django.conf import settings
-from packaging import version
-
+import logging
 
-@cached(timeout=settings.UPDATE_CACHE_TIMEOUT, extra=settings.UPDATE_REPO_URL)
-def get_releases(pre_releases=False):
-    url = '{}/releases'.format(settings.UPDATE_REPO_URL)
-    headers = {
-        'Accept': 'application/vnd.github.v3+json',
-    }
-    try:
-        response = requests.get(url, headers=headers)
-        releases = [(version.parse(release['tag_name']), release.get('html_url'))
-                    for release in response.json()
-                    if 'tag_name' in release]
-    except Exception:
-        releases = []
+from cacheops import CacheMiss, cache
+from django.conf import settings
 
-    if not pre_releases:
-        releases = [(release, url)
-                    for release, url in releases
-                    if not release.is_devrelease and not release.is_prerelease]
+from utilities.background_tasks import get_releases
 
-    return releases
+# Get an instance of a logger
+logger = logging.getLogger(__name__)
 
 
 def get_latest_release(pre_releases=False):
     if settings.UPDATE_REPO_URL:
-        releases = get_releases(pre_releases)
-        if releases:
-            return max(releases)
+        try:
+            releases = cache.get('netbox_releases')
+            if releases:
+                return max(releases)
+        except CacheMiss:
+            logger.debug("Starting background task to get releases")
+
+            # Get the releases in the background worker, it will fill the cache
+            get_releases.delay(pre_releases=pre_releases)
 
     return 'unknown', None