Ошибка `SynchronousOnlyOperation` при попытке запустить автоматизацию Playwright, вызванную действием администратора django
Это ошибка:
SynchronousOnlyOperation at /admin/app/modelA/
You cannot call this from an async context - use a thread or sync_to_async.
Что я пытаюсь сделать:
У меня есть действие в django-admin, которое предназначено для запуска автоматической задачи с помощью Playwright.
Действие в admin.py
выглядит следующим образом:
@admin.action(description="Do task")
def run_task(modeladmin, request, queryset):
for obj in queryset:
task = Task(obj)
task.run()
А класс Task
выглядит следующим образом:
class Task:
def __init__(self, task: Task) -> None:
self.task = task
def run(self):
with sync_playwright() as p:
browser = p.chromium.launch(headless=True)
page = browser.new_page()
page.go_to("www.google.com")
# DO SOME STUFF
browser.close()
Когда я запускаю действие, ошибка появляется, как только хром становится готовым.
Заранее спасибо.
Я ожидаю, что он будет делать то, что не запускается, по крайней мере, получит заголовок страницы.
Я пробовал использовать sync_to_async
как предлагают эти документы , реализовал это двумя способами (которые я считаю неправильными)
Первый способ, который я попробовал:
<@admin.action(description="Do task")
def run_test(modeladmin, request, queryset):
for obj in queryset:
task = Task(obj)
sync_to_async(task.run, thread_sensitive=True)
Из-за попытки использовать sync async в файле, когда вызывается функция :
Не сработало
2. Второй способ, который я пробовал:
Это путем добавления декоратора к функции run
...
@sync_to_async
def run(self, ...):
...
...
Не сработало
Асинхронная функция может быть запущена в django без установки DJANGO_ALLOW_ASYNC_UNSAFE в True с помощью декоратора @async_to_sync.
from asgiref.sync import async_to_sync
from playwright.async_api import async_playwright
@async_to_sync
async def async_function(...):
await ...
Эта документация может быть более полезной.
Обратите внимание на необходимость использования async_playwright в async-функции