如何从Django Rest Framework接收POST请求?

时间:2018-04-12 15:58:54

标签: django rest post django-rest-framework postman

我构建了一个API,使用Django 2和Django Rest Framework。所有get方法都可以,首先使用身份验证来接收令牌并使用此令牌访问所有其他方法。唯一的问题是我唯一接收POST数据的功能。

问题是这个POST方法的调用总是返回,甚至提供“授权”令牌,这条消息:

  

“{”detail“:”未提供身份验证凭据。“}

有趣的是,在POSTMAN中它有效!另一位开发人员尝试使用JavaScript,它总是返回此消息。我尝试使用PHP使用CURL发出POST请求并给出相同的错误。只需使用POSTMAN即可...

这是我在settings.py中的Django Rest Framework设置:

INSTALLED_APPS = [
    ...
    'rest_framework.authtoken',
    ...
]
REST_FRAMEWORK = {
    'DEFAULT_PERMISSION_CLASSES': (
        'rest_framework.permissions.IsAuthenticated',
    ),
    'DEFAULT_AUTHENTICATION_CLASSES': (
        'rest_framework.authentication.TokenAuthentication',
    ),
}

这是在views.py:

中称为trought API的方法
@api_view(['POST'])
def api_inventory_sector_items_check(request, branch_id, inventory_id, sector_id):
    # Do something

这是url.py:

# ...
from rest_framework.urlpatterns import format_suffix_patterns
# ...
urlpatterns = [
    ...   
    path('.../check', # See the long URL bellow
    views.api_inventory_sector_items_check,
    name='app.api.inventory_sector_items_check'),
]
# ...

所以我试图使用POST调用:

  

{{域}} /应用/ API / V1 /分支/ 1 /库存/ 2 /扇区/ 100101329 /项目/检查

     

'Content-Type:application / json'

     

'授权:令牌令牌efad3303547374b7c035499218ad5d0cceb03178'

并且在帖子中张贴了一些数据......

正如我之前所说,使用POSTMAN一切都没问题。但是当我们尝试通过任何其他“方法”提交此帖子时,它会返回相同的消息。细节:使用相同的HEADER,但对于GET请求,一切正常。

使用返回“...未提供凭据”的PHP的请求示例。

<?php
$data = array(
"data"=>"{'id':'20012738', 'obs': '', 'resp':'325880','final':1}",
);        

$data_string = json_encode($data);                                                                                   

$ch = 
curl_init('http://localhost/app/api/v1/branches/1/
inventories/7/sectors/100162162/items/check');                                                                  
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, "POST");                                                                     
curl_setopt($ch, CURLOPT_POSTFIELDS, $data_string);                                                                  
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);                                                                      
curl_setopt($ch, CURLOPT_HTTPHEADER, array(                                                                          
    'Content-Type: application/json',                                                                                
    'Content-Length: ' . strlen($data_string)),
    'Authorization: Token efad3303547374b7c035499218ad5d0cceb03178'                           
);                                                                                                                   

$result = curl_exec($ch);
echo $result;
?>
有人可以帮帮我吗?非常感谢你!

2 个答案:

答案 0 :(得分:1)

你有一个微妙的错字:

curl_setopt($ch, CURLOPT_HTTPHEADER, array(
    'Content-Type: application/json',
    'Content-Length: ' . strlen($data_string)),
    'Authorization: Token efad3303547374b7c035499218ad5d0cceb03178'
);  

array()在添加Authorization标头之前结束(请注意内容长度标题末尾的右括号)。这将阻止令牌正确传输,并可能导致身份验证错误。

更改为:

curl_setopt($ch, CURLOPT_HTTPHEADER, array(
    'Content-Type: application/json',
    'Content-Length: ' . strlen($data_string),
    'Authorization: Token efad3303547374b7c035499218ad5d0cceb03178')
);  

答案 1 :(得分:1)

我提交的PHP代码错误,Will Kelling会帮助我。谢谢。无论如何,为Django Rest API提交POST数据都没有回复数据......我通过使用解决了这个问题:

request.body

而不是

request.POST.get('data')

然后,我的代码变成这样:

@api_view(['POST'])
def api_inventory_sector_items_check(request, branch_id, inventory_id, sector_id):
        try:
            sector_items = request.body
            except Exception:
                return Response({"detail": "No data received or isn't a JSON data"}, status=status.HTTP_406_NOT_ACCEPTABLE)

        try:
            sector_items = json.loads(sector_items)
        except json.JSONDecodeError or TypeError:
            return Response({
                'detail': "Data received has a wrong format. This is not a JSON var."
            }, status=status.HTTP_404_BAD_REQUEST)