无法从 Django 中的请求获取值 - Empty QueryDict
Cannot get values from request in Django - Empty QueryDict
我是 ViewSets 的新手,我正在尝试获取从前端 fetch 方法发送到创建函数中的 Django 请求对象的值。不知道是简单的语法错误还是前端没有正确发送数据,我觉得应该是后端的问题
post 方法中的字符串化数据似乎在前端正确记录,就像这个测试一样:
{"title":"test","type":"landing","slug":"","notes":""}
然而,在 ViewSet 的创建函数中打印变量会显示这些:
print(request.POST["title"]) # fails with keyerror: 'title' MultiValueDictKeyError(key) django.utils.datastructures.MultiValueDictKeyError: 'title'
print(request["title"]) # fails with TypeError: 'Request' object is not subscriptable
print(request.POST.get("title", “test”)) # fails as print test
print(request.POST.get("title")) # fails as it just returns None
print(request.get("title")) # fails with AttributeError: 'WSGIRequest' object has no attribute 'get'
print(self.request.query_params.get("title", None)) # prints None
print(self.request.query_params) # prints empty QueryDict: <QueryDict: {}>
创建函数如下:
class PagesViewSet(viewsets.ViewSet):
def create(self, request):
# printing went here
page = Page.objects.create(
title="testing", type="other", slug="test-slug", notes="test notes"
)
serializer = PageSerializer(page)
return Response(serializer.data)
我刚刚在页面创建方法中加入了演示数据以确保它能正常工作,现在我想使用应该在请求中的真实数据。
有谁知道这里可能是什么问题?
为了可见性,这里是前端API-请求函数:
const createPage = async (data: CreatePageFormInputs) => {
console.log('stringified: ', JSON.stringify(data)); // logs correctly
const res = await fetchCreatePage('http://localhost:8000/api/pages/', {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify(data),
});
};
可能无关紧要,但如果您想知道 fetchCreatePage
是什么,它只是自定义反应挂钩的这一部分:
const fetchCreatePage: FetchDataFn = async (url, options?) => {
const setFailed = () => {
setFetchError(true);
setLoading(false);
};
const setSuccess = (data: any) => {
setData(data);
setLoading(false);
};
try {
setLoading(true);
const res = await fetch(url, options);
if (!res.ok) {
console.log('Error detected. Returning...');
setFailed();
return;
}
if (res.status === 204) {
setSuccess({
success: true,
info: 'Item successfully deleted',
});
return;
}
const data = await res.json();
setSuccess(data);
} catch (e) {
setFailed();
}
}
我认为 POST 方法是正确的。如有任何帮助,我们将不胜感激。
您以 JSON 格式将数据作为请求正文写入。因此,您应该将 JSON 格式解码为具有以下内容的字典:
import json
data = json.loads(<strong>request.body</strong>)
print(data<strong>['title']</strong>)
如果您使用的是来自 Django REST 框架的请求,您将使用 request.data
:
import json
print(request<b>.data</b>['title'])
request.data
将查找 POST 参数和 JSON 正文。
我是 ViewSets 的新手,我正在尝试获取从前端 fetch 方法发送到创建函数中的 Django 请求对象的值。不知道是简单的语法错误还是前端没有正确发送数据,我觉得应该是后端的问题
post 方法中的字符串化数据似乎在前端正确记录,就像这个测试一样:
{"title":"test","type":"landing","slug":"","notes":""}
然而,在 ViewSet 的创建函数中打印变量会显示这些:
print(request.POST["title"]) # fails with keyerror: 'title' MultiValueDictKeyError(key) django.utils.datastructures.MultiValueDictKeyError: 'title'
print(request["title"]) # fails with TypeError: 'Request' object is not subscriptable
print(request.POST.get("title", “test”)) # fails as print test
print(request.POST.get("title")) # fails as it just returns None
print(request.get("title")) # fails with AttributeError: 'WSGIRequest' object has no attribute 'get'
print(self.request.query_params.get("title", None)) # prints None
print(self.request.query_params) # prints empty QueryDict: <QueryDict: {}>
创建函数如下:
class PagesViewSet(viewsets.ViewSet):
def create(self, request):
# printing went here
page = Page.objects.create(
title="testing", type="other", slug="test-slug", notes="test notes"
)
serializer = PageSerializer(page)
return Response(serializer.data)
我刚刚在页面创建方法中加入了演示数据以确保它能正常工作,现在我想使用应该在请求中的真实数据。
有谁知道这里可能是什么问题?
为了可见性,这里是前端API-请求函数:
const createPage = async (data: CreatePageFormInputs) => {
console.log('stringified: ', JSON.stringify(data)); // logs correctly
const res = await fetchCreatePage('http://localhost:8000/api/pages/', {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify(data),
});
};
可能无关紧要,但如果您想知道 fetchCreatePage
是什么,它只是自定义反应挂钩的这一部分:
const fetchCreatePage: FetchDataFn = async (url, options?) => {
const setFailed = () => {
setFetchError(true);
setLoading(false);
};
const setSuccess = (data: any) => {
setData(data);
setLoading(false);
};
try {
setLoading(true);
const res = await fetch(url, options);
if (!res.ok) {
console.log('Error detected. Returning...');
setFailed();
return;
}
if (res.status === 204) {
setSuccess({
success: true,
info: 'Item successfully deleted',
});
return;
}
const data = await res.json();
setSuccess(data);
} catch (e) {
setFailed();
}
}
我认为 POST 方法是正确的。如有任何帮助,我们将不胜感激。
您以 JSON 格式将数据作为请求正文写入。因此,您应该将 JSON 格式解码为具有以下内容的字典:
import json
data = json.loads(<strong>request.body</strong>)
print(data<strong>['title']</strong>)
如果您使用的是来自 Django REST 框架的请求,您将使用 request.data
:
import json
print(request<b>.data</b>['title'])
request.data
将查找 POST 参数和 JSON 正文。