Проблема при выполнении операции CRUD с помощью Django REST API
Здравствуйте, я новичок в Django Rest Framework. Недавно я создал REST API с именем "api/studentapi", используя django REST framework на локальном хосте. Операция CRUD работает совершенно нормально в просматриваемом API. Но когда я пытаюсь получить доступ к тому же API из стороннего файла python, я не могу выполнить операцию POST, хотя я могу выполнить операцию GET. При выполнении операции POST сервер отвечает мне как "Unsupported Media Type: /api/studentapi/".Я выкладываю серию изображений кода, чтобы было понятнее. Стороннее python приложение, которое я создал для доступа к "api/studentapi"
Файловая структура моего проекта
Модель формы, которую я создал
Файлы сериализатора, которые я создал
Убедитесь, что вы передаете заголовок content type во время запросов post и put, поскольку именно так django_rest_framework
понимает, какой парсер он будет использовать. Django rest framework поддерживает тип содержимого form-data
, JSON
, x-www-form-urlencoded
и multipart
из коробки.
Если вы отправляете данные в формате JSON, добавьте заголовок к вашему запросу:
Content-Type: application/json
Если вы отправляете данные формы или файл(ы), добавьте заголовок:
Content-Type: multipart/form-data
Если вы отправляете только данные формы, используйте:
Content-Type: application/x-form-urlencoded
Для вашего кода вот как добавить заголовок
r = request.post(
url=URL,
data=json_data,
headers= {
'Content-Type': 'application/json'
}
)
TL;DR:
Вам нужно передать полезную нагрузку как аргумент json
в requests.post
:
data = {
"name": "sa",
"roll": 1,
"city": "lam"
}
r = requests.post(url=URL, json=data)
Подробности:
Как указано в официальной документации библиотеки requests
:
url = 'https://api.github.com/some/endpoint'
payload = {'some': 'data'}
r = requests.post(url, data=json.dumps(payload))
Обратите внимание, что приведенный выше код НЕ добавит заголовок Content-Type (в частности, он НЕ установит его в application/json).
.Если вам нужен этот заголовок и вы не хотите кодировать dict самостоятельно, вы также можете передать его напрямую, используя параметр json (добавлен в версии 2.4.2), и он будет закодирован автоматически:
url = 'https://api.github.com/some/endpoint'
payload = {'some': 'data'}
r = requests.post(url, json=payload)
import json
import requests
url = "https://127.0.0.1:8000/api/studentapi/"
data_response = {
"name": "sa",
"roll": 1,
"city": "lam"
}
data_json = json.dumps(data_response)
req = requests.post(url, data=data_json)