Ошибка `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-функции

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