[Bf-extensions-cvs] [db4f7e2d] master: BlenderKit: rerequests library this library basically ensures that no server requests should fail if the token is after it's lifetime. it refreshes token and re-tries the request in such cases.

Vilém Duha noreply at git.blender.org
Mon Sep 2 13:52:36 CEST 2019


Commit: db4f7e2dc66d437b205f8097c2bdf9097b5c8834
Author: Vilém Duha
Date:   Mon Sep 2 13:50:06 2019 +0200
Branches: master
https://developer.blender.org/rBAdb4f7e2dc66d437b205f8097c2bdf9097b5c8834

BlenderKit: rerequests library
this library basically ensures that no server requests should fail if the token is after it's lifetime.
it refreshes token and re-tries the request in such cases.

===================================================================

M	blenderkit/bkit_oauth.py
M	blenderkit/categories.py
M	blenderkit/download.py
M	blenderkit/ratings.py
A	blenderkit/rerequests.py
M	blenderkit/search.py
M	blenderkit/upload.py
M	blenderkit/upload_bg.py
M	blenderkit/utils.py

===================================================================

diff --git a/blenderkit/bkit_oauth.py b/blenderkit/bkit_oauth.py
index f435d95d..57d3389f 100644
--- a/blenderkit/bkit_oauth.py
+++ b/blenderkit/bkit_oauth.py
@@ -74,7 +74,7 @@ def refresh_token(api_key_refresh, url):
     auth_token, refresh_token = authenticator.get_refreshed_token(api_key_refresh)
     if auth_token is not None and refresh_token is not None:
         tasks_queue.add_task((write_tokens, (auth_token, refresh_token)))
-
+    return auth_token, refresh_token
 
 def write_tokens(auth_token, refresh_token):
     utils.p('writing tokens')
@@ -85,7 +85,7 @@ def write_tokens(auth_token, refresh_token):
     props = utils.get_search_props()
     if props is not None:
         props.report = ''
-    ui.add_report('BlenderKit Login success')
+    ui.add_report('BlenderKit Re-Login success')
     search.get_profile()
     categories.fetch_categories_thread(auth_token)
 
diff --git a/blenderkit/categories.py b/blenderkit/categories.py
index 6407b050..1d411499 100644
--- a/blenderkit/categories.py
+++ b/blenderkit/categories.py
@@ -22,8 +22,9 @@ if "bpy" in locals():
     paths = reload(paths)
     utils = reload(utils)
     tasks_queue = reload(tasks_queue)
+    rerequests = reload(rerequests)
 else:
-    from blenderkit import paths, utils, tasks_queue
+    from blenderkit import paths, utils, tasks_queue, rerequests
 
 import requests
 import json
@@ -114,7 +115,7 @@ def fetch_categories(API_key):
     categories_filepath = os.path.join(tempdir, 'categories.json')
 
     try:
-        r = requests.get(url, headers=headers)
+        r = rerequests.get(url, headers=headers)
         rdata = r.json()
         categories = rdata['results']
         fix_category_counts(categories)
diff --git a/blenderkit/download.py b/blenderkit/download.py
index 366081ca..9f5f0314 100644
--- a/blenderkit/download.py
+++ b/blenderkit/download.py
@@ -25,8 +25,9 @@ if "bpy" in locals():
     ui = reload(ui)
     colors = reload(colors)
     tasks_queue = reload(tasks_queue)
+    rerequests = reload(rerequests)
 else:
-    from blenderkit import paths, append_link, utils, ui, colors, tasks_queue
+    from blenderkit import paths, append_link, utils, ui, colors, tasks_queue, rerequests
 
 import threading
 import time
@@ -266,7 +267,7 @@ def report_usages():
         scene['assets rated'][k] = scene['assets rated'].get(k, False)
     thread = threading.Thread(target=utils.requests_post_thread, args=(url, usage_report, headers))
     thread.start()
-    # r = requests.post(url, headers=headers, json=usage_report)
+    # r = rerequests.post(url, headers=headers, json=usage_report)
     mt = time.time() - mt
     print('report generation:                ', mt)
 
@@ -551,6 +552,7 @@ class Downloader(threading.Thread):
             tcom.downloaded = 100
             utils.p('not downloading, trying to append again')
             return;
+
         file_name = paths.get_download_filenames(asset_data)[0]  # prefer global dir if possible.
         # for k in asset_data:
         #    print(asset_data[k])
@@ -617,7 +619,6 @@ def download(asset_data, **kwargs):
         asset_data = copy.deepcopy(asset_data)
     else:
         asset_data = asset_data.to_dict()
-
     readthread = Downloader(asset_data, tcom, scene_id, api_key)
     readthread.start()
 
@@ -730,7 +731,7 @@ def get_download_url(asset_data, scene_id, api_key, tcom=None):
     }
     r = None
     try:
-        r = requests.get(asset_data['download_url'], params=data, headers=headers)
+        r = rerequests.get(asset_data['download_url'], params=data, headers=headers)
     except Exception as e:
         print(e)
         if tcom is not None:
@@ -755,10 +756,6 @@ def get_download_url(asset_data, scene_id, api_key, tcom=None):
         tasks_queue.add_task((ui.add_report, (r1, 5, colors.RED)))
         tcom.error = True
 
-    if r.status_code == 401:
-        tcom.report = 'Invalid API key'
-        tcom.error = True
-        return 'Invalid API key'
     elif r.status_code >= 500:
         tcom.report = 'Server error'
         tcom.error = True
@@ -833,7 +830,6 @@ class BlenderkitDownloadOperator(bpy.types.Operator):
     bl_label = "BlenderKit Asset Download"
     bl_options = {'REGISTER', 'UNDO', 'INTERNAL'}
 
-
     asset_type: EnumProperty(
         name="Type",
         items=asset_types,
diff --git a/blenderkit/ratings.py b/blenderkit/ratings.py
index ddf01e6c..7684d017 100644
--- a/blenderkit/ratings.py
+++ b/blenderkit/ratings.py
@@ -21,8 +21,9 @@ if "bpy" in locals():
 
     paths = reload(paths)
     utils = reload(utils)
+    rerequests = reload(rerequests)
 else:
-    from blenderkit import paths, utils
+    from blenderkit import paths, utils, rerequests
 
 import bpy
 import requests, threading
@@ -67,14 +68,14 @@ def uplaod_rating_thread(url, ratings, headers):
             }
 
             try:
-                r = requests.put(rating_url, data=data, verify=True, headers=headers)
+                r = rerequests.put(rating_url, data=data, verify=True, headers=headers)
 
             except requests.exceptions.RequestException as e:
                 print('ratings upload failed: %s' % str(e))
 
 
 def uplaod_review_thread(url, reviews, headers):
-    r = requests.put(url, data=reviews, verify=True, headers=headers)
+    r = rerequests.put(url, data=reviews, verify=True, headers=headers)
 
     # except requests.exceptions.RequestException as e:
     #     print('reviews upload failed: %s' % str(e))
diff --git a/blenderkit/rerequests.py b/blenderkit/rerequests.py
new file mode 100644
index 00000000..d58214bc
--- /dev/null
+++ b/blenderkit/rerequests.py
@@ -0,0 +1,95 @@
+# ##### BEGIN GPL LICENSE BLOCK #####
+#
+#  This program is free software; you can redistribute it and/or
+#  modify it under the terms of the GNU General Public License
+#  as published by the Free Software Foundation; either version 2
+#  of the License, or (at your option) any later version.
+#
+#  This program is distributed in the hope that it will be useful,
+#  but WITHOUT ANY WARRANTY; without even the implied warranty of
+#  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+#  GNU General Public License for more details.
+#
+#  You should have received a copy of the GNU General Public License
+#  along with this program; if not, write to the Free Software Foundation,
+#  Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+#
+# ##### END GPL LICENSE BLOCK #####
+
+if "bpy" in locals():
+    from importlib import reload
+
+    ui = reload(ui)
+    utils = reload(utils)
+    paths = reload(paths)
+    tasks_queue = reload(tasks_queue)
+    bkit_oauth = reload(bkit_oauth)
+else:
+    from blenderkit import ui, utils, paths, tasks_queue, bkit_oauth
+
+import requests
+import bpy
+
+
+def rerequest(method, url, **kwargs):
+    # first get any additional args from kwargs
+    immediate = False
+    if kwargs.get('immediate'):
+        immediate = kwargs['immediate']
+        kwargs.pop('immediate')
+    # first normal attempt
+    response = requests.request(method, url, **kwargs)
+
+    utils.p(url)
+    utils.p(response.status_code)
+
+    if response.status_code == 401:
+        try:
+            rdata = response.json()
+        except:
+            rdata = {}
+
+        tasks_queue.add_task((ui.add_report, (method + ' request Failed.' + str(rdata.get('detail')),)))
+
+        if rdata.get('detail') == 'Invalid token.':
+            user_preferences = bpy.context.preferences.addons['blenderkit'].preferences
+            if user_preferences.api_key != '':
+                if user_preferences.enable_oauth:
+                    tasks_queue.add_task((ui.add_report, ('refreshing token.',)))
+                    refresh_url = paths.get_bkit_url()
+                    auth_token, refresh_token = bkit_oauth.refresh_token(user_preferences.api_key_refresh, refresh_url)
+
+                    # utils.p(auth_token, refresh_token)
+                    if auth_token is not None:
+                        if immediate == True:
+                            # this can write tokens occasionally into prefs. used e.g. in upload. Only possible
+                            #  in non-threaded tasks
+                            bpy.context.preferences.addons['blenderkit'].preferences.api_key = auth_token
+                            bpy.context.preferences.addons['blenderkit'].preferences.api_key_refresh = refresh_token
+
+                        kwargs['headers'] = utils.get_headers(auth_token)
+                        response = requests.request(method, url, **kwargs)
+                        utils.p('reresult', response.status_code)
+                        if response.status_code >= 400:
+                            utils.p('reresult', response.text)
+    return response
+
+
+def get(url, **kwargs):
+    response = rerequest('get', url, **kwargs)
+    return response
+
+
+def post(url, **kwargs):
+    response = rerequest('post', url, **kwargs)
+    return response
+
+
+def put(url, **kwargs):
+    response = rerequest('put', url, **kwargs)
+    return response
+
+
+def patch(url, **kwargs):
+    response = rerequest('patch', url, **kwargs)
+    return response
diff --git a/blenderkit/search.py b/blenderkit/search.py
index f19a019e..96c50a0e 100644
--- a/blenderkit/search.py
+++ b/blenderkit/search.py
@@ -27,8 +27,9 @@ if "bpy" in locals():
     bkit_oauth = reload(bkit_oauth)
     version_checker = reload(version_checker)
     tasks_queue = reload(tasks_queue)
+    rerequests = reload(rerequests)
 else:
-    from blenderkit import paths, utils, categories, ui, bkit_oauth, version_checker, tasks_queue
+    from blenderkit import paths, utils, categories, ui, bkit_oauth, version_checker, tasks_queue, rerequests
 
 import blenderkit
 from bpy.app.handlers import persistent
@@ -121,9 +122,11 @@ def timer_update():  # TODO might get moved to handle all blenderkit stuff.
     # causing a lot of throuble literally.
     if len(search_threads) == 0 or bpy.context.scene.blenderkitUI.dragging:
         return 1
-    for thread in search_threads:  # TODO this doesn't check all processess when removal... mostly 1 process will be running however.
+    for thread in search_threads:  # TODO this doesn't check all processess whe

@@ Diff output truncated at 10240 characters. @@



More information about the Bf-extensions-cvs mailing list