Вызов модуля просмотра через запросы не создает надлежащие данные сеанса - PullRequest
2 голосов
/ 09 июня 2019

Предположим, у меня есть два вида, как показано ниже:

def get_session_key(request):
    return JsonResponse({'session_key': request.session.session_key})

def test(request):
    import requests
    r = requests.get('http://127.0.0.1:8000/get_session_key')
    return HttpResponse(r)
  1. Почему вызов get_session_key сам по себе вернет действительный ответ - содержащий сеансовый ключ - тогда как вызов этой функции с test до requests вернет {"session_key": null}?

  2. Есть ли способ использовать requests для вызова этого представления и при этом получить действительный ключ сеанса?

1 Ответ

1 голос
/ 09 июня 2019

Почему вызов get_session_key сам по себе возвращает правильный ответ - содержащий ключ сеанса - тогда как вызов этой функции из теста через запросы вернет {"session_key": null}?

Идентификатор сеанса хранится в cookie, как описано в документации на Как использовать Cookies :

Django обеспечивает полную поддержку анонимных сессий. Инфраструктура сеансов позволяет хранить и извлекать произвольные данные для каждого посетителя сайта. Он хранит данные на стороне сервера и объявляет об отправке и получении файлов cookie. Файлы cookie содержат идентификатор сеанса , а не сами данные (если вы не используете серверную часть на основе файлов cookie).

Теперь, если вы звоните с библиотекой requests, вы, конечно, не передаете эти куки в систему, следовательно, вы делаете звонок без куки, и, следовательно, без идентификатора сеанса.

Однако вы можете получить куки с помощью request.COOKIES [Django-doc] при выполнении запроса GET, например:

def test(request):
    import requests
    r = requests.get(
        'http://127.0.0.1:8000/get_session_key',
        <b>cookies=request.COOKIES</b>
    )
    return HttpResponse(r.content)

Поскольку идентификатор сеанса, однако, равен в файлах cookie, для этого конкретного случая нет особого смысла делать запрос GET.

...