Запрос django token msg: объект 'set' не имеет атрибута 'items'
Я пытаюсь получить токен из аутентификации Django. Но я получаю следующую ошибку:
Exception type: <class 'AttributeError'> msg: 'set' object has no attribute 'items'
Мой тестовый фрагмент кода выглядит следующим образом:
import os
import requests
import json
from dotenv import load_dotenv
load_dotenv()
BASE_DEV_URL = "http://127.0.0.1:4000"
def login(url=(BASE_DEV_URL + "/api/user/token")):
headers = {
'accept: application/json',
'accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8',
'Content-Type:' 'application/x-www-form-urlencoded',
}
try:
payload = {"email": os.getenv('TEST_USER_NAME'), "password": os.getenv('TEST_USER_PASSWORD')}
print(payload)
res = requests.post(url, data=json.dumps(payload), headers=headers)
print(f'####### {type(res)}')
except Exception as e:
return f'Exception type: {type(e)} msg: {e}'
return res
response = login()
print(response)
Однако, когда я тестирую его с swagger с помощью команды curl, он работает нормально. curl выглядит следующим образом
curl -X 'POST' \
'http://127.0.0.1:4000/api/user/token/' \
-H 'accept: application/json' \
-H 'Content-Type: application/x-www-form-urlencoded' \
-H 'X-CSRFTOKEN: T7wW385wMiYDERJU2yWvqGorrbKjtb9zhWqlAkAlE30QKgP7DoQMbc7MnQT3UAti' \
-d 'email=test%40example.com&password=123XVW174'
Есть идеи, как заставить это работать. Я не уверен, но это может быть связано с сериализацией. Я много работал с библиотекой request и никогда не сталкивался с такой ошибкой. Буду благодарен за любой совет, который поможет решить эту проблему.
Ваши заголовки должны быть словарем, а не набором, поэтому:
headers = {
'accept': 'application/json',
'accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8',
'Content-Type': 'application/x-www-form-urlencoded',
}
В итоге я отключил crfs в промежуточном ПО.
MIDDLEWARE = [
'django.middleware.security.SecurityMiddleware',
'django.contrib.sessions.middleware.SessionMiddleware',
'django.middleware.common.CommonMiddleware',
# 'django.middleware.csrf.CsrfViewMiddleware',
'django.contrib.auth.middleware.AuthenticationMiddleware',
'django.contrib.messages.middleware.MessageMiddleware',
'django.middleware.clickjacking.XFrameOptionsMiddleware',
]
Мои заголовки и запрос выглядят следующим образом:
headers = {
'accept': 'application/json',
'Content-Type': 'application/x-www-form-urlencoded',
'multipart': 'form-data',
}
payload = {"email": os.getenv('TEST_USER_NAME'), "password": os.getenv('TEST_USER_PASSWORD')}
res = requests.post(url, data=payload, headers=headers)
В итоге я получаю ответ 200 и правильные данные. Однако я хотел бы знать, как правильно сгенерировать crf токен для тестирования