Ошибка Python TikTokApi SynchronousOnlyOperation
У меня есть проект Django, в котором я пытаюсь получить информацию о пользователе TikTok из представления django, основанного на классе. Я столкнулся с проблемой, которая, похоже, связана с async/sync/threading.
Связанные документы: https://docs.djangoproject.com/en/3.2/topics/async/
Я попробовал украсить представления, описанные в приведенной выше ссылке, но все равно безуспешно. Я добавил этот кусочек кода в мой gunicorn wsgi файл os.environ.setdefault("DJANGO_ALLOW_ASYNC_UNSAFE", "true") который действительно устраняет проблему, но кажется, что это плохая идея.
Вот часть кода, которую я использую для вызова TikTokAPI:
def get_user_info(username):
verify_fp = "code here"
try:
api = TikTokApi(custom_verify_fp=verify_fp)
user = api.user(username=username)
info = user.info_full()
return info
except Exception:
return None
class TikTokAccount(APIView):
def post(self, request, *args, **kwargs):
...
info = get_user_info(username)
...
Traceback (most recent call last):
File "/projects/social-bean/.pyenv/lib/python3.9/site-packages/gevent/pywsgi.py", line 999, in handle_one_response
self.run_application()
File "/projects/social-bean/.pyenv/lib/python3.9/site-packages/gevent/pywsgi.py", line 951, in run_application
close()
File "/projects/social-bean/.pyenv/lib/python3.9/site-packages/django/http/response.py", line 259, in close
signals.request_finished.send(sender=self._handler_class)
File "/projects/social-bean/.pyenv/lib/python3.9/site-packages/django/dispatch/dispatcher.py", line 177, in send
return [
File "/projects/social-bean/.pyenv/lib/python3.9/site-packages/django/dispatch/dispatcher.py", line 178, in <listcomp>
(receiver, receiver(signal=self, sender=sender, **named))
File "/projects/social-bean/.pyenv/lib/python3.9/site-packages/django/db/__init__.py", line 57, in close_old_connections
conn.close_if_unusable_or_obsolete()
File "/projects/social-bean/.pyenv/lib/python3.9/site-packages/django/db/backends/base/base.py", line 510, in close_if_unusable_or_obsolete
if self.get_autocommit() != self.settings_dict['AUTOCOMMIT']:
File "/projects/social-bean/.pyenv/lib/python3.9/site-packages/django/db/backends/base/base.py", line 389, in get_autocommit
self.ensure_connection()
File "/projects/social-bean/.pyenv/lib/python3.9/site-packages/django/utils/asyncio.py", line 24, in inner
raise SynchronousOnlyOperation(message)
django.core.exceptions.SynchronousOnlyOperation: You cannot call this from an async context - use a thread or sync_to_async.
2022-02-26T02:14:04Z {'REMOTE_ADDR': '::1', 'REMOTE_PORT': '50871', 'HTTP_HOST': 'localhost:8080', (hidden keys: 27)} failed with SynchronousOnlyOperation
Python3.9 / Django 3.2 ОС: MacOS / Ubuntu TikTokApi Версия [5.0.0]
Есть идеи, как решить проблему?
Я не пробовал свой пакет TikTokApi на Django, но да, сейчас у него есть некоторые проблемы с потоками, которые я планирую исправить, надеюсь, в ближайшие две недели или около того.
Тем временем, кто-то сделал PR, который может помочь вам в решении проблем с потоками https://github.com/davidteather/TikTok-Api/pull/846 В этом PR изменился синтаксис на использование оператора with. Я постараюсь сделать это необязательным выражением with, когда этот PR будет объединен с master.