Ошибка 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.

Вернуться на верх