Axios post request не отдает никаких данных представлению django
Я пытаюсь сделать свой первый запрос на пост с помощью axios к представлению Django, которое принимает как POST, так и GET. Я получаю пустой dict из request.POST:
<QueryDict: {}>
[13/Aug/2022 16:44:00] "POST /users/114260670592402026255 HTTP/1.1" 200 9
Сервер действительно возвращает код состояния 200, но данные, которые я отправил из пользовательского интерфейса, отсутствуют.
У меня есть следующее представление django:
from django.shortcuts import render
from django.http import HttpResponse
from django.views.decorators.csrf import csrf_exempt
import json
from .models import UserProfile
@csrf_exempt
def get_user_profile(request, user_id):
if request.method == 'GET':
try:
user = UserProfile.objects.get(user_id=user_id)
print("user found")
except Exception as error:
print("User profile wasnt found:")
print(error)
user = None
profile = UserProfile()
profile.user_id = user_id
profile.searches = [
{'search_term': 'hd'},
{'search_term': 'wba'},
]
profile.save()
print("user saved in db")
user = UserProfile.objects.get(user_id=user_id)
data = {
'user_id': user.user_id,
'searches': user.searches
}
json_data = json.dumps(data)
return HttpResponse(json_data, content_type='application/json')
if request.method == 'POST':
data = request.POST
print(data)
return HttpResponse("it worked")
в приложении пользовательского интерфейса, SearchPage.js:
useEffect(() => {
console.log("user id changed")
if (userId) {
const user_profile_api_url = BASE_URL + '/users/' + userId
axios.get(user_profile_api_url, {})
.then(response => {
const recent_searches_response = response.data.searches;
const new_recent_searches = [];
recent_searches_response.map(dict => {
new_recent_searches.push(dict.search_term)
})
setRecentSearches(new_recent_searches);
})
.catch((error) => {
console.log("error in getting user profile: ", error.message)
})
}
}, [userId])
useEffect(() => {
const user_profile_api_url = BASE_URL + '/users/' + userId
const data = {searches: recentSearches}
// axios.post(user_profile_api_url, {
// params: {
// searches: recentSearches
// }
// })
axios.post(user_profile_api_url, data
})
.then(response => {
console.log(response)
})
}, [recentSearches])
Как вы можете видеть, я передаю его обычным способом, как второй аргумент, затем я также пробую передать его так, как это делает курс Udemy, используя клавишу params
. Ни то, ни другое не работает. Я подозреваю, что причиной проблемы может быть @csrf_exempt
, но я следую тому же формату, что и все примеры в Интернете. Я хочу получить данные recentSearches
из запроса post в представлении Django
Ответ сервера после выполнения запроса:
вкладка сети
axios is async
Вы можете позвонить, например, по телефону
useEffect( async () => {
const user_profile_api_url = BASE_URL + '/users/' + userId
const data = {searches: recentSearches}
const response = await axios.post(user_profile_api_url, data)
console.log(response)
}, [recentSearches])
больше копания привело к документации Django по http-запросам, мне следовало начать с этого, а не с примеров сторонних производителей
print(request.body)
данные можно найти в request.body в представлении django и преобразовать в объект python, загрузив json
b'{"searches":["hd","wba","psec"]}'