簡體   English   中英

使用REST Framework在Django中從POST獲取JSON數據

[英]Get JSON data from POST in Django with REST Framework

我正在嘗試使用Gspread在Django中為Google Spreadsheet構建REST API,我遇到了很多問題(因此,如果有人碰巧有一個完整的示例,請隨時分享...,請問:)? )。 這些問題之一是我試圖接收POST請求的JSON(當然,稍后還會收到其他請求)。 但是,這是失敗的。 這是我的代碼:

view.py(我知道IF語句不是這樣工作的

elif request.method == 'POST':
    received_json_data = json.loads(request.body.decode("utf-8"))
    content = received_json_data['content']
    if content != "":
        worksheet.insert_row([content["date"], content["days"], content["firstname"], content["lastname"], content["team"], content["training"], content["company"], content["city"], content["cost"], content["invoice"], content["info"]], 1)
        return JsonResponse(content, safe=False, status=status.HTTP_201_CREATED)
    else:
        return JsonResponse([], safe=False, status=status.HTTP_400_BAD_REQUEST)

為此編寫了一個測試:

def test_post_all_training_returns_201_when_correct_format(self):
    """
    A POST request on /trainings/ should create a new training
    """
    headers = {'content-type': 'application/json'}
    response = self.client.post('/trainings/', json=json.dumps(self.training_json_body), headers=headers, format="json")
    self.assertEqual(response.status_code, status.HTTP_201_CREATED)

training_json_body的內容:

self.training_json_body = {
    "date": "1/1/2018",
    "days": 1,
    "firstname": "Data",
    "lastname": "Data",
    "team": "Data",
    "training": "Data",
    "company": "Data",
    "city": "Data",
    "cost": 1,
    "invoice": "Data",
    "info": "Data"
}

追溯

Traceback (most recent call last):
File "C:\Python\backend\unleashedapp\trainings\tests.py", line 64, in test_post_all_training_returns_201_when_correct_format
    response = self.client.post('/trainings/', json=json.dumps(self.training_json_body), headers=headers, format="json")
File "C:\Users\yanni\AppData\Local\Programs\Python\Python36-32\lib\site-packages\django\test\client.py", line 525, in post
    response = super().post(path, data=data, content_type=content_type, secure=secure, **extra)
File "C:\Users\yanni\AppData\Local\Programs\Python\Python36-32\lib\site-packages\django\test\client.py", line 341, in post
    secure=secure, **extra)
File "C:\Users\yanni\AppData\Local\Programs\Python\Python36-32\lib\site-packages\django\test\client.py", line 404, in generic
    return self.request(**r)
File "C:\Users\yanni\AppData\Local\Programs\Python\Python36-32\lib\site-packages\django\test\client.py", line 485, in request
    raise exc_value
File "C:\Users\yanni\AppData\Local\Programs\Python\Python36-32\lib\site-packages\django\core\handlers\exception.py", line 35, in inner
    response = get_response(request)
File "C:\Users\yanni\AppData\Local\Programs\Python\Python36-32\lib\site-packages\django\core\handlers\base.py", line 128, in _get_response
    response = self.process_exception_by_middleware(e, request)
File "C:\Users\yanni\AppData\Local\Programs\Python\Python36-32\lib\site-packages\django\core\handlers\base.py", line 126, in _get_response
    response = wrapped_callback(request, *callback_args, **callback_kwargs)
File "C:\Users\yanni\AppData\Local\Programs\Python\Python36-32\lib\site-packages\django\views\decorators\csrf.py", line 54, in wrapped_view
    return view_func(*args, **kwargs)
File "C:\Python\backend\unleashedapp\trainings\views.py", line 36, in training_list
    received_json_data = json.loads(request.body.decode("utf-8"))
File "C:\Users\yanni\AppData\Local\Programs\Python\Python36-32\lib\json\__init__.py", line 354, in loads
    return _default_decoder.decode(s)
File "C:\Users\yanni\AppData\Local\Programs\Python\Python36-32\lib\json\decoder.py", line 339, in decode
    obj, end = self.raw_decode(s, idx=_w(s, 0).end())
File "C:\Users\yanni\AppData\Local\Programs\Python\Python36-32\lib\json\decoder.py", line 357, in raw_decode
    raise JSONDecodeError("Expecting value", s, err.value) from None
json.decoder.JSONDecodeError: Expecting value: line 1 column 1 (char 0)

我已經搜索了幾天的解決方案,但無法使其正常工作,因此,如果有人可以向正確的方向推動我,我將非常感激。


我已將代碼更新為以下內容:

class TrainingList(APIView):
    def post(self, request, format=None):
        sheet = request.GET.get('sheet', 'Data')
        worksheet = spreadsheet.worksheet(sheet)
        worksheet.append_row([request.data.get("date"), request.data.get("days"), request.data.get("firstname"), request.data.get("lastname"), request.data.get("team"), request.data.get("training"), request.data.get("company"), request.data.get("city"), request.data.get("cost"), request.data.get("invoice"), request.data.get("info")])
        return JsonResponse("[]", safe=False, status=status.HTTP_201_CREATED)

這不再引發任何錯誤,但是append_row()函數現在為每個字段添加“ None”,因此顯然數據仍然沒有通過。 我怎樣才能解決這個問題?

如果您使用的是Django REST框架,則可以通過訪問request.data字典輕松地從請求對象中獲取數據( 此處提供更多信息 )。

如果使用的是django原始視圖,則可以使用請求對象並訪問request.POST['<field_name>']或`request.POST.get('')來訪問POST數據。 例如:

request.POST.get("date")

您可以閱讀有關此內容的更多信息或在此處查看示例。

嘗試這個:

request.data.get("sheet")

要獲取Json格式的參數,您需要將請求的子方法從“ GET”更改為“ DATA”,如下所示:

sheet = request.data.get("sheet")

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM