Как правильно передать контекст в функцию playwright при использовании python django в качестве основы для webapp?

У меня есть веб-приложение, которое я сначала создал на Flask, а затем полностью перестроил на Django, чтобы получить преимущества интерфейса администратора. Оно создает флаер для детского футбольного матча, используя контекст для наложения на фоновое изображение через абсолютную позицию css. Когда тренер доволен изображением, кнопка вызывает функцию Generate, которая открывает браузер с playwright и передает данные сессии, чтобы воссоздать изображение и позволить тренеру загрузить его.

Когда тренер просматривает изображение, текстовые поля заполняются из контекста. все работает нормально.

def image(request):
... some other bits ...
    for key in request.session.keys():
        context[key] = request.session[key]
    return render(request, 'coaches/image.html', context)

Это пример из шаблона, который показывает, как текст добавляется из контекста. Я использую движок Django Template.

          {% for player in squad %}
          <td>
            <span class="playernumber">{{ player.number }}</span>
            <span class="playerfirstname">{{ player.first }}</span>
            <span class="playerlastname">{{ player.last }}</span>
          </td>
            {% if forloop.counter|divisibleby:2 %}
                </tr>
                <tr>
              {% endif %}
          {% endfor %}

тот же код шаблона не работает при вызове браузерного представления playwright. представление работает, шаблон работает, но вызов переменных из контекста не работает.

Это связано с разным способом работы. В функции playwright вы передаете всю сессию.

def generate(request):
    session_data = {
        "name": "mysite",
        "value": request.COOKIES.get("mysite"),
        "url": request.META['HTTP_HOST']
    }
    target_url = request.META['HTTP_HOST'] + "/coaches/image"
    image_bytes = take_screenshot_from_url(target_url, session_data)

при этом функция playwright выглядит следующим образом. (Я следил за этой статьей real python, создавая форматтер кода, чтобы понять, делает ли этот шаблон то, что я хочу).

def take_screenshot_from_url(url, session_data):
    with sync_playwright() as playwright:
        webkit = playwright.webkit
        browser = webkit.launch()
        browser_context = browser.new_context(device_scale_factor=2)
        browser_context.add_cookies([session_data])
        page = browser_context.new_page()
        page.goto(url)
        screenshot_bytes = page.locator("#squad-image").screenshot()
        browser.close()
        return screenshot_bytes

Внутри шаблона переменные просто не заполняются. Я понял, что переменная session_data содержит ключевое значение, где, собственно, и находятся мои переменные сессии. но я не знаю, как правильно к ним обращаться.

Я пробовал всевозможные способы, включая сериализацию/десериализацию, создание dict и передачу его, даже просто передачу одной переменной.

Я знаю, что, возможно, у меня есть фундаментальная ошибка в том, как я понимаю, что здесь происходит, буду благодарен за предложения о том, что нужно прочитать. Я попробовал вернуться к основам, и это работает, я думаю, что недостаток в том, как я понимаю разницу между тем, что сессия Django хранит данные в куках, а Flask этого не делает. Затем, как построить вызов представления драматурга с фактическим cookie.

В итоге все решилось очень просто - исправлением ошибки с урлом. Я сильно перемудрил, но все дело в том, что я не проверил правильность url. У меня было две проблемы с этим, поскольку изначально я настроил его на https. но, конечно, запустив сервер разработки, вы запустили http.

поэтому

это было единственное реальное изменение, которое требовалось.
...
"url": f"http://{request.META['HTTP_HOST']}/"
}

Теперь мне нужно найти переменную сессии/запроса, которая содержит полный url, поскольку HTTP_HOST не включает протокол, а это, очевидно, важно в dev env.

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