Backend - Django JsonResponse HttpResponse

2023-12-12 04:01

本文主要是介绍Backend - Django JsonResponse HttpResponse,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

目录

一、关系

二、使用

(一)data 字典传值

1. HttpResponse

(1)写法

(2)前端接收 HttpResponse 回传的值

2. JsonResponse

(1)写法

(2)前端接收 JsonResponse 回传的值

3. 特殊数据类型的处理

4. 例子

(二)JsonResponse 有一个 safe 参数

1. safe 作用

2. 若报错:TypeError: In order to allow non-dict objects to be serialized set the safe parameter to False

(1)原因

(2)解决


一、关系

        JsonResponse 是 HttpResponse 的一个子类。

        从1.7版本开始,Django使用内置JsonResponse类。

二、使用

(一)data 字典传值

1. HttpResponse

(1)写法

HttpResponse 的 content 参数值必须是引号包裹的字符串。

比如,若 data 参数值是个对象(字典),则用 json.dumps 将 data 值转成JSON字串。

# HttpResponse
import json
return HttpResponse(json.dumps(mydict))
(2)前端接收 HttpResponse 回传的值

因为,HttpResponse传的值是通过json处理后的字串格式。所以,前端ajax收到的data是json字串格式,需要用JSON.parse(data)处理,去除json字串。

2. JsonResponse

(1)写法

JsonResponse 的 data 参数可以是个对象(字典)。

# JsonResponse
from django.http import JsonResponse
return JsonResponse(mydict)
(2)前端接收 JsonResponse 回传的值

因为,JsonResponse传的值是字典,没有经过json处理。所以,前端可以不用JSON.parse(data)处理,直接使用。

3. 特殊数据类型的处理

        若是queryset类型的列表,可以先利用列表生成式转换成阵列,再传给前端。

# JsonResponse
from django.http import JsonResponse
myqst = models.Book.objects.filter(booktype='文艺类').values_list('name', flat=True)
mylist = [m for m in myqst]
return JsonResponse(mylist)

4. 例子

import json
from django.http import JsonResponse
data= {'name': '萝卜干'}# 第一种
HttpResponse(json.dumps(data), content_type='application/json')  # 第一个参数位置,默认是content的参数值,第二个位置需要指定是什么参数的值,比如content_type=XXX# 第二种(几乎等价于第一种)
JsonResponse(data)  # 默认的content_type='application/json'

 json相关知识可参考另一篇文章:Backend - Python 序列化-CSDN博客

(二)JsonResponse 有一个 safe 参数

1. safe 作用

        默认为 True,控制JsonResponse中只有dict对象可以序列化。

2. 若报错:TypeError: In order to allow non-dict objects to be serialized set the safe parameter to False

(1)原因

        JsonResponse中的safe参数为True,要求data值类型必须为字典,若非字典则抛出一个 TypeError 类型错误。  

(2)解决

        方法① 传data参数为字典类型。

        方法② 若想传列表List类型等,则设置参数safe=False。如下面代码:

return JsonResponse(result)
# 改为:
return JsonResponse(result, safe=False)

这篇关于Backend - Django JsonResponse HttpResponse的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/483163

相关文章

Python库 Django 的简介、安装、用法入门教程

《Python库Django的简介、安装、用法入门教程》Django是Python最流行的Web框架之一,它帮助开发者快速、高效地构建功能强大的Web应用程序,接下来我们将从简介、安装到用法详解,... 目录一、Django 简介 二、Django 的安装教程 1. 创建虚拟环境2. 安装Django三、创

Django中的函数视图和类视图以及路由的定义方式

《Django中的函数视图和类视图以及路由的定义方式》Django视图分函数视图和类视图,前者用函数处理请求,后者继承View类定义方法,路由使用path()、re_path()或url(),通过in... 目录函数视图类视图路由总路由函数视图的路由类视图定义路由总结Django允许接收的请求方法http

Django HTTPResponse响应体中返回openpyxl生成的文件过程

《DjangoHTTPResponse响应体中返回openpyxl生成的文件过程》Django返回文件流时需通过Content-Disposition头指定编码后的文件名,使用openpyxl的sa... 目录Django返回文件流时使用指定文件名Django HTTPResponse响应体中返回openp

Django开发时如何避免频繁发送短信验证码(python图文代码)

《Django开发时如何避免频繁发送短信验证码(python图文代码)》Django开发时,为防止频繁发送验证码,后端需用Redis限制请求频率,结合管道技术提升效率,通过生产者消费者模式解耦业务逻辑... 目录避免频繁发送 验证码1. www.chinasem.cn避免频繁发送 验证码逻辑分析2. 避免频繁

对Django中时区的解读

《对Django中时区的解读》:本文主要介绍对Django中时区的解读方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录背景前端数据库中存储接口返回AI的解释问题:这样设置的作用答案获取当前时间(自动带时区)转换为北京时间显示总结背景设置时区为北京时间 TIM

Django之定时任务django-crontab的实现

《Django之定时任务django-crontab的实现》Django可以使用第三方库如django-crontab来实现定时任务的调度,本文主要介绍了Django之定时任务django-cront... 目录crontab安装django-crontab注册应用定时时间格式定时时间示例设置定时任务@符号

Django序列化中SerializerMethodField的使用详解

《Django序列化中SerializerMethodField的使用详解》:本文主要介绍Django序列化中SerializerMethodField的使用,具有很好的参考价值,希望对大家有所帮... 目录SerializerMethodField的基本概念使用SerializerMethodField的

如何使用celery进行异步处理和定时任务(django)

《如何使用celery进行异步处理和定时任务(django)》文章介绍了Celery的基本概念、安装方法、如何使用Celery进行异步任务处理以及如何设置定时任务,通过Celery,可以在Web应用中... 目录一、celery的作用二、安装celery三、使用celery 异步执行任务四、使用celery

Django中使用SMTP实现邮件发送功能

《Django中使用SMTP实现邮件发送功能》在Django中使用SMTP发送邮件是一个常见的需求,通常用于发送用户注册确认邮件、密码重置邮件等,下面我们来看看如何在Django中配置S... 目录1. 配置 Django 项目以使用 SMTP2. 创建 Django 应用3. 添加应用到项目设置4. 创建

如何用Docker运行Django项目

本章教程,介绍如何用Docker创建一个Django,并运行能够访问。 一、拉取镜像 这里我们使用python3.11版本的docker镜像 docker pull python:3.11 二、运行容器 这里我们将容器内部的8080端口,映射到宿主机的80端口上。 docker run -itd --name python311 -p