[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