我在发布到我的API时遇到了麻烦,并且无法弄清楚错误的含义。如果重要的话,我正在使用Django REST并包含回溯。
if (repeat == false) {
post_data = {'User': usernameInput}
$.ajax({
type: 'POST',
url: '/0/addUser',
data: post_data,
async: true
})
}
class AddUser(APIView):
def post(self, request, format = None):
serializer = UserSerializer(data=request.data)
if serializer.isvalid():
serializer.save()
return Response(serializer.data, status=status.HTTP_201_CREATED)
Traceback:
File "/Library/Python/2.7/site-packages/django/core/handlers/base.py" in get_response
111. response = wrapped_callback(request, *callback_args, **callback_kwargs)
File "/Library/Python/2.7/site-packages/django/views/decorators/csrf.py" in wrapped_view
57. return view_func(*args, **kwargs)
File "/Library/Python/2.7/site-packages/django/views/generic/base.py" in view
69. return self.dispatch(request, *args, **kwargs)
File "/Library/Python/2.7/site-packages/rest_framework/views.py" in dispatch
403. response = self.handle_exception(exc)
File "/Library/Python/2.7/site-packages/rest_framework/views.py" in dispatch
400. response = handler(request, *args, **kwargs)
File "/Users/rae/Desktop/112/djangotemplate/notes/views.py" in post
23. serializer = UserSerializer(data=request.data)
File "/Library/Python/2.7/site-packages/rest_framework/request.py" in __getattr__
436. return getattr(self._request, attr)
答案 0 :(得分:8)
Django REST Framework有自己的Request
对象,它包装了Django传入的HttpRequest
对象,并添加了一些额外的功能(如自定义渲染和另一个身份验证层)。如果在Request
对象上访问了不存在的任何属性,它将自动将其代理到基础HttpRequest
,因此通常您不会注意到差异。
在DRF 2.x中,Request
属性具有DATA
和FILES
属性,用于存储传入的数据以及已检测到的任何文件。这些在DRF 3.0中合并,并替换为单个data
属性。随着DRF 3.0的发布,所有文档现在都反映了新的Request.data
属性。
您似乎正在使用Django REST Framework 2.x,但您正在尝试访问DRF 3.0中引入的新属性。因为它在Request
对象上不存在,所以它被代理到HttpRequest
对象,在那里它也没有被找到。
答案 1 :(得分:2)
如果使用视图方法遇到此问题,则可以尝试使用@api_view
装饰器
@api_view(["POST"])
def Function(request, <other-stuff>):
# do the thing
答案 2 :(得分:0)
序列化器需要drf请求,但是您拥有的请求是django提供的WSGIRequest。
我使用以下函数来检索请求。
from django.http import HttpRequest
from rest_framework.request import Request
def preprocess_request(request):
if isinstance(request, HttpRequest):
return Request(request, parsers=[FormParser])
return request
您可能要使用单独的解析器或提供多个解析器。我的问题稍有不同,只需要FormParser!