使用 REST Framework 从 Django 中的 POST 获取 JSON 数据

2024-01-02

我正在尝试在 Django 中为带有 Gspread 的 Google 电子表格构建 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字典(更多信息在这里 http://www.django-rest-framework.org/api-guide/requests/).

如果您使用的是普通 Django 视图,那么您可以通过使用请求对象并访问来访问 POST 数据request.POST['<field_name>'] or request.POST.get('<field_name>').

例如:

request.POST.get("date")

您可以阅读更多相关内容或查看示例here https://rnvarma.gitbooks.io/intro-to-django-real/content/part-2-dynamic-websites-with-databasing/retrieving-post-data-in-the-view.html.

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用 REST Framework 从 Django 中的 POST 获取 JSON 数据 的相关文章

随机推荐

  • Netbeans 安装找不到 JDK [关闭]

    Closed 这个问题是无关 help closed questions 目前不接受答案 在我的 Windows 计算机上安装 Netbeans 6 0 1 时 我发现以下错误 Even if I my enviroment variabl
  • 如何堵住此类孔 2

    跟随从here https stackoverflow com questions 58032008 how to plug this type hole 58032339 58032339 我已将 main 中的代码重构为它自己的函数 我
  • 对文件发出 json/jsonp xhr 请求:协议

    我正在编写一个 javascript 应用程序 该应用程序将托管在file 协议 即 应用程序只是位于我硬盘上某个位置的 html css 和 javascript 的文件夹 当我尝试正常的 XHR 请求时 它们由于同源策略问题而失败 所以
  • DataGridView 以编程方式排序

    我创建了从 DataGridViewTextBoxColumn 类派生的自定义 DataGridViewNumericTextBoxColumn 当我打电话时 this HeaderDataGridView Sort Sort Progra
  • 写入套接字输出流而不关闭它

    我想向服务器写入一些消息 每次 仅对于传输 我都会关闭输出流 并在必须发送下一条消息时重新打开它 os write msgBytes os write r n getBytes os flush os close 如何保持该 Socket
  • 主机不更新报告中的数据

    我正在尝试在 Raspberry Pi Pico 上使用 TinyUSB 开发自定义 UPS 并让 UPower 在我的 Ubuntu 主机上发现它 我试图向主机发出充电状态信号 但主机将电池报告为空 UPower 而不是充电 等离子桌面电
  • 如何 JSON.stringify dom 元素?

    如 title 所示 如何对 dom 元素进行 JSON stringify 并将 json 改回 dom 元素 有哪位知道怎么办吗 谢谢 Here is the code var container document querySelec
  • 如何使用 Tkinter after() 方法?

    我在使用时遇到问题after中的方法Tkinter 计划是打印i间隔一秒 我检查了是否after方法合适 但具体不知道 这是代码 coding utf 8 from Tkinter import import time root Tk ro
  • 卡尔曼滤波器:如何在没有“状态转换模型”的情况下使用它?

    我正在使用 Android 手机开发加速度计 我希望过滤掉加速度计返回记录手机移动的可怕噪音 我正在阅读卡尔曼滤波器 因为低通滤波器还不够 但我没有从ACCELERATION k 1 to ACCELERATION k 因为它是用户的动作
  • android 从url下载文件并保存到内存盘

    我尝试从 url 下载文件并将其保存到内存购物车 但我无法理解我的错误是什么 我的代码是 URL url new URL imageURL File file new File fileName long startTime System
  • 即使位于堆栈顶部,有时也会创建 singleTop Activity

    我有一个 Activity 其 launchMode 为 singleTop 在清单中 我的理解是 如果一个 Activity 是 singleTop 并且它位于 Activity 堆栈的顶部 那么使用新 Intent 启动 Activit
  • Python Windows 路径斜杠[重复]

    这个问题在这里已经有答案了 我在 python 脚本中使用目录路径面临一个非常基本的问题 当我从 Windows 资源管理器复制路径时 它使用反斜杠作为路径分隔符 这导致了问题 gt gt gt x D testfolder gt gt g
  • 有没有办法让 @Builder 注释适用于不可变类?

    我正在尝试在 Groovy 中开发一个项目 我一直在查看我的代码并尝试找到可以用更惯用的 Groovy 替换的区域 直到找到解决方案我遇到的另一个问题 https stackoverflow com questions 28355773 i
  • 使 div 向下滑动而不将内容向下推

    我有一个例子HERE http jsfiddle net yGZHC 我不知道如何使 div 向下滑动 但将内容保持在顶部 就像 div 向下滑动时不向下滑动一样 你能帮我解决这个问题吗 你的意思是类似这样吗 http jsfiddle n
  • java中如何从线程传播异常?

    Code outerMethod Override public void run innerMethod throws IOException 在线程中执行的方法会抛出检查异常 IOException 我需要在主线程中处理这个异常 喜欢
  • Twitter Fabric xcode - 上传分发时出错:存档分发错误:-3

    我正在尝试使用适用于 mac 的 Fabric 插件分发新的测试版 网络和代理配置正确 我可以使用浏览器访问需要代理验证的 URL 当我尝试上传应用程序时 该过程结束时出现错误 3 http 错误 400 存档分发错误 3 无法上传发行版
  • 有没有办法防止响应式引导程序占用太多宽度?

    我想使用 bootstrap 的响应式功能 但不适用于 gt 1200px 的布局 在宽度 gt 1200px 的设备上 它应该充当下方的设备尺寸 是否可以调整元视口或添加一些 css 以使最大设备宽度为 1200px 自定义引导程序最好的
  • 在 PropertyGrid 中使用自定义颜色选择器对话框

    在属性网格中默认颜色选择器对话框 https dl dropbox com u 14076298 ShareX 2013 10 mAGsVrcIPn png不允许设置颜色的 alpha 值 我已经做了我自己的颜色选择器对话框 https d
  • 使用主键以外的其他内容作为 RealURL id_field

    在 TYPO3 6 2 站点中 我有以下内容postVarSets在 realurl conf php 中用于 extbase 扩展 postVarSets gt array DEFAULT gt array wba gt array ar
  • 使用 REST Framework 从 Django 中的 POST 获取 JSON 数据

    我正在尝试在 Django 中为带有 Gspread 的 Google 电子表格构建 REST API 我遇到了很多问题 所以如果有人碰巧有完整的示例 请随时分享 好吗 其中一个问题是我正在尝试接收 POST 请求的 JSON 当然 稍后还