Python-запросы с Django Rest Framework - 'detail': 'Учетные данные для аутентификации не были предоставлены'
У меня есть маленькая функция, которая просто хочет получить ответ от моей конечной точки DRF API.
Мои настройки DRF выглядят следующим образом:
"DEFAULT_AUTHENTICATION_CLASSES": [
# Enabling this it will require Django Session (Including CSRF)
"rest_framework.authentication.SessionAuthentication"
],
"DEFAULT_PERMISSION_CLASSES": [
# Globally only allow IsAuthenticated users access to API Endpoints
"rest_framework.permissions.IsAuthenticated"
],
Я использую это, чтобы попытаться попасть в конечную точку:
def get_car_details(car_id):
headers = {"X-Requested-With": "XMLHttpRequest"}
api_app = "http://localhost:8000/"
api_model = "cars/"
response = requests.get(api_app + api_model + str(car_id), headers=headers)
json_response = response.json()
return json_response
Я продолжаю получать 'detail': 'Authentication credentials were not provided'
Нужно ли мне генерировать CSRF-токен и включать его в GET-запрос? Единственный раз, когда это происходит, это когда пользователь переходит к представлению, которое требует, чтобы он вошел в систему. Есть ли способ передать этого вошедшего пользователя конечной точке?
Когда вы делаете запрос из функции get_car_details
, вы должны быть уверены, что запрос аутентифицирован. Это не похоже на проблему CSRF.
При использовании аутентификации на основе сеанса куки сеанса передаются обратно после входа в систему. Поэтому перед вызовом get_car_details
необходимо сначала сделать запрос на вход, сохранить сессию и использовать ее при вызове API.
Requests есть класс сессии requests.Session()
, который вы можете использовать для этой цели. Подробности здесь: https://docs.python-requests.org/en/latest/user/advanced/
Многие считают аутентификацию на основе маркеров более простой, поскольку не нужно сохранять куки сессии.