django-rest-framework导致RawPostDataException:您不能访问body [英] django-rest-framework causes RawPostDataException: You cannot access body

查看:3785
本文介绍了django-rest-framework导致RawPostDataException:您不能访问body的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

  //客户端
$ .ajax( {
type:POST,
url:api,
contentType:application / json; charset = utf-8,
headers:{'X-CSRFToken ':'{{csrf_token}}'},
data:JSON.stringify({
x:$(#x)。val(),
}),
success:response,
dataType:'json',
minLength:0,
});

#server - views.py:
@staff_member_required
def api(request):
params = request.POST

但是除了ajax方法之外,我想要一种辅助方法来允许人们使用令牌认证,因此我修改了view.py,如下所示: p>

 #server  -  views.py:
@api_view(['GET','POST'])
@authentication_classes((TokenAuthentication,SessionAuthentication,BasicAuthentication))
@permission_classes((IsAuthenticated,))
@staff_member_required
def api(request):
params = request.POST

和令牌验证客户端代码:

  headers = {'Authorization':'Token {}'。format(mytoken),'Content-Type':'application / json'} 
response = requests.post(BASE_URL, header = headers,json = data)

一旦添加了@api_view,我的ajax请求会导致服务器错误:

 错误:内部服务器错误:/ api 
追溯(最近的最后一次呼叫):
文件venv / lib / python2.7 / site-packages / django / core /handlers/base.py,第132行,get_response
response = wrapped_callback(request,* callback_args,** callback_kwargs)
文件venv / lib / python2.7 / site-packages / django / views / decorators / csrf.py,第58行,wrapped_view
return view_func(* args,** kwargs)
文件venv / lib / python2.7 / site-packages / django / views /通用/ base.py,第71行,视图
return self.dispatch(request,* args,** kwargs)
文件venv / lib / python2.7 / site-packages / rest_framework / views.py,第466行,在调度中
response = self.handle_exception(exc)
文件venv / lib / python2.7 / site-packages / rest_framework / views.py,第463行,在调度
response = handler(request,* args,** kwargs)
文件venv / lib / python2.7 / site-packages / rest_framework / decorators.py,第53行,处理程序
return func(* args,** kwargs)
Fil evenv / lib / python2.7 / site-packages / django / contrib / auth / decorators.py,第22行,_wrapped_view
return view_func(request,* args,** kwargs)
文件/home/mike/mike/myapp/myapp/myapp/views.py,第422行,api
params = json.loads(request.body)
文件venv / lib / python2 .7 / site-packages / rest_framework / request.py,第357行,__getattribute__
return getattr(self._request,attr)
文件venv / lib / python2.7 / site-packages / django / http / request.py,第231行,身体
raise RawPostDataException(从请求的数据流读取后,您无法访问正文)
RawPostDataException:从请求的数据流读取后无法访问正文


解决方案

显然,一旦你使用django-rest-framework,你必须使用

  params = request.data 

来检索数据。
http://www.django-rest-framework.org/ api-guide / requests /



感谢django-rest-framework IRC。


I have this code that works fine with my ajax request:

    // client
    $.ajax({
        type: "POST",
        url: "api",
        contentType: "application/json; charset=utf-8",
        headers: {'X-CSRFToken': '{{ csrf_token }}'},
        data: JSON.stringify({
            x: $("#x").val(),
        }),
        success: response,
        dataType: 'json',
        minLength: 0,
    });

# server - views.py:
@staff_member_required
def api(request):
    params = request.POST

but in addition to the ajax approach, I want a secondary approach to allow people use token authentication so I modified the view.py as below:

# server - views.py:
@api_view(['GET', 'POST'])
@authentication_classes((TokenAuthentication, SessionAuthentication, BasicAuthentication))
@permission_classes((IsAuthenticated,))
@staff_member_required
def api(request):
    params = request.POST

and the token authentication client code:

headers = {'Authorization': 'Token {}'.format(mytoken), 'Content-Type': 'application/json'}
response = requests.post(BASE_URL, headers=headers, json=data)

As soon as I add @api_view, my ajax request causes a server error:

ERROR: Internal Server Error: /api
Traceback (most recent call last):
  File "venv/lib/python2.7/site-packages/django/core/handlers/base.py", line 132, in get_response
    response = wrapped_callback(request, *callback_args, **callback_kwargs)
  File "venv/lib/python2.7/site-packages/django/views/decorators/csrf.py", line 58, in wrapped_view
    return view_func(*args, **kwargs)
  File "venv/lib/python2.7/site-packages/django/views/generic/base.py", line 71, in view
    return self.dispatch(request, *args, **kwargs)
  File "venv/lib/python2.7/site-packages/rest_framework/views.py", line 466, in dispatch
    response = self.handle_exception(exc)
  File "venv/lib/python2.7/site-packages/rest_framework/views.py", line 463, in dispatch
    response = handler(request, *args, **kwargs)
  File "venv/lib/python2.7/site-packages/rest_framework/decorators.py", line 53, in handler
    return func(*args, **kwargs)
  File "venv/lib/python2.7/site-packages/django/contrib/auth/decorators.py", line 22, in _wrapped_view
    return view_func(request, *args, **kwargs)
  File "/home/mike/mike/myapp/myapp/myapp/views.py", line 422, in api
    params = json.loads(request.body)
  File "venv/lib/python2.7/site-packages/rest_framework/request.py", line 357, in __getattribute__
    return getattr(self._request, attr)
  File "venv/lib/python2.7/site-packages/django/http/request.py", line 231, in body
    raise RawPostDataException("You cannot access body after reading from request's data stream")
RawPostDataException: You cannot access body after reading from request's data stream

解决方案

Apparently once you use django-rest-framework, you'll have to use

params = request.data

to retrieve data. http://www.django-rest-framework.org/api-guide/requests/

Thanks to django-rest-framework IRC.

这篇关于django-rest-framework导致RawPostDataException:您不能访问body的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆