首页 > 其他分享 >2.Request,Response和序列化类

2.Request,Response和序列化类

时间:2024-08-01 10:40:25浏览次数:9  
标签:None serializers Request request 序列化 data Response

【一】不同编码格式的http请求

  • django视图类或视图函数的request
# 只针对post请求的urlencoded编码格式才有数据(<QueryDict:{"a":"a"}>)
request.POST
# 请求地址框中获得数据(<QueryDict:{"a":["a"]}>)
request.GET
	# 只取一个
    request.GET.get('key')
	# 回去全部
    request.GET.getlist('key')
# 获取地址栏的数据(/eg/?a=a)
request.get_full_path()
# 无论什么编码均能取到数据(b'{"a":"a"}')
request.body
# 获得请求方式
request.method

【二】新Request对象和Response

from rest_framework.views import APIView
from rest_framework.response import Response

class BookView(APIView):
    def get(self,request):
        return Response({'code':100,'msg':'ok'})
  • 继承APIView后,使用drf响应
  • 需要在settings内注册才能使用(rest_framework)

1)新Request

  • request请求对象:http请求的所有内容都会在这个对象内

  • 继承APIView后的request对象不再是之前的request对象

  • 新旧区别

    • 旧:django.core.handlers.wsgi.WSGIRequest

    • 新:rest_framework.request.Request

    • 用法区别不大

  • request.data

    • 可获取所有编码格式的请求体数据,均可当字典使用
    • urlencoded,form-data:是QueryDict对象
    • json:字典对象
  • request.FILES

    • 可获取前端传的文件
  • request.query_params

    • 请求地址框中获得数据,同request.GET

2)Response

  • 可在响应体内直接放字典、列表、字符串

  • 放状态码与响应头

    Response('ok',status=201,headers={'a':1})
    
  • Response的所有参数

    # 响应头,可传字典、列表、字符串
    data=None
    # http响应的状态码(drf封装了所有常量)
    status=None
    # 指定使用浏览器访问返回的模板,没写用默认模板
    template_name=None
    # 响应头
    headers=None
    # 异常
    exception=False
    # 响应编码格式(一般不改)
    content_type=None
    

【三】序列化类

1)作用

  • 序列化:后端从数据库获取对象,以json格式传给前端

  • 反序列化:前端传json格式字符串给后端,后端须保存到数据库

2)查询案例

  • models.py
class Student(models.Model):
    name = models.CharField(
        verbose_name='姓名',
        max_length=32
    )
    age = models.IntegerField(
        verbose_name='年龄'
    )
    sex = models.IntegerField(
        verbose_name='性别',
        choices=[(0, '保密'), (1, '男'), (2, '女')],
        default=0
    )
  • 新建serializers.py
from rest_framework import serializers

class StudentSerializer(serializers.Serializer):
    id = serializers.IntegerField()
    name = serializers.CharField()
    age = serializers.IntegerField()
    sex = serializers.IntegerField()
  • views.py
from rest_framework.views import APIView
from App.serializers import StudentSerializer
from rest_framework.response import Response
from App.models import Student

class StudentView(APIView):
    # 多条查询
    def get(self, request):
        students = Student.objects.all()
        # 使用drf提供的序列化完成序列化
        # 多条需要写many=True
        serializer = StudentSerializer(instance=students, many=True)
        return Response(serializer.data)
    
class StudentDetailView(APIView):
    # 查询单条
    def get(self, request, pk):
        student = Student.objects.get(pk=pk)
        serializer = StudentSerializer(instance=student)
        return Response(serializer.data)

3)常用字段

字段 字段构造方式
BooleanField BooleanField()
NullBooleanField NullBooleanField()
CharField CharField(max_length=None, min_length=None, allow_blank=False, trim_whitespace=True)
EmailField EmailField(max_length=None, min_length=None, allow_blank=False)
RegexField RegexField(regex, max_length=None, min_length=None, allow_blank=False)
SlugField SlugField(maxlength=50, min_length=None, allow_blank=False) 正则字段,验证正则模式 [a-zA-Z0-9-]+
URLField URLField(max_length=200, min_length=None, allow_blank=False)
UUIDField UUIDField(format=’hex_verbose’) format: 1) 'hex_verbose'"5ce0e9a5-5ffa-654b-cee0-1238041fb31a" 2) 'hex'"5ce0e9a55ffa654bcee01238041fb31a" 3)'int' - 如: "123456789012312313134124512351145145114" 4)'urn' 如: "urn:uuid:5ce0e9a5-5ffa-654b-cee0-1238041fb31a"
IPAddressField IPAddressField(protocol=’both’, unpack_ipv4=False, **options)
IntegerField IntegerField(max_value=None, min_value=None)
FloatField FloatField(max_value=None, min_value=None)
DecimalField DecimalField(max_digits, decimal_places, coerce_to_string=None, max_value=None, min_value=None) max_digits: 最多位数 decimal_palces: 小数点位置
DateTimeField DateTimeField(format=api_settings.DATETIME_FORMAT, input_formats=None)
DateField DateField(format=api_settings.DATE_FORMAT, input_formats=None)
TimeField TimeField(format=api_settings.TIME_FORMAT, input_formats=None)
DurationField DurationField()
ChoiceField ChoiceField(choices) choices与Django的用法相同
MultipleChoiceField MultipleChoiceField(choices)
FileField FileField(max_length=None, allow_empty_file=False, use_url=UPLOADED_FILES_USE_URL)
ImageField ImageField(max_length=None, allow_empty_file=False, use_url=UPLOADED_FILES_USE_URL)
ListField ListField(child=, min_length=None, max_length=None)
DictField DictField(child=)

4)常用字段参数

  • 选项参数
参数名称 作用
max_length 最大长度
min_lenght 最小长度
allow_blank 是否允许为空
trim_whitespace 是否截断空白字符
max_value 最小值
min_value 最大值
  • 通用参数
参数名称 说明
read_only 表明该字段仅用于序列化输出,默认False
write_only 表明该字段仅用于反序列化输入,默认False
required 表明该字段在反序列化时必须输入,默认True
default 反序列化时使用的默认值
allow_null 表明该字段是否允许传入None,默认False
validators 该字段使用的验证器
error_messages 包含错误编号与错误信息的字典
label 用于HTML展示API页面时,显示的字段名称
help_text 用于HTML展示API页面时,显示的字段帮助提示信息

【四】反序列化--保存

1)添加与修改

  • serializers.py
class StudentSerializer(serializers.Serializer):
    # 写要序列化的字段
    id = serializers.IntegerField(required=False)
    name = serializers.CharField()
    age = serializers.IntegerField()
    sex = serializers.IntegerField(required=False, default=0)

    # 重新create方法
    def create(self, validated_data):
        student = Student.objects.create(**validated_data)
        return student

    # 重建update方法
    def update(self, instance, validated_data):
        for key in validated_data:
            # 等同于 instance.name = validated_data.get('name')...
            setattr(instance, key, validated_data.get(key))
        instance.save()
        return instance
  • views.py
from rest_framework.views import APIView
from App.serializers import StudentSerializer
from rest_framework.response import Response
from App.models import Student

class StudentView(APIView):
    # 添加
    def post(self, request):
        # 获取前端传入的数据
        serializer = StudentSerializer(data=request.data)
        # 反序列化校验,并保存
        if serializer.is_valid():
            serializer.save()
            return Response(serializer.data)
            # return Response('保存成功', status=200)
        else:
            return Response('保存失败', status=400)


class StudentDetailView(APIView):
    # 修改
    def put(self, request, pk):
        student_obj = Student.objects.get(pk=pk)
        # 获取要修改的数据,前端的数据
        serializer = StudentSerializer(instance=student_obj, data=request.data)
        if serializer.is_valid():
            serializer.save()
            return Response(serializer.data)
        else:
            return Response('保存失败', status=400)

标签:None,serializers,Request,request,序列化,data,Response
From: https://www.cnblogs.com/Mist-/p/18336156

相关文章

  • 二进制序列化和字符串序列化
    经常用json字符串序列化,倒是忘记也可做二进制序列化。在文件上传时,如果序列化为字符串,再按字符串上传,这样是否会数据量变大呢?今天试了试两种序列化方式:dotnet自带的BinaryFormatter和Newtonsoft privatevoidbutton3_Click(objectsender,EventArgse){......
  • [HTTP] HTTP 协议 Response Header 之 Content-Length、Transfer-Encoding与Content-E
    0引言在近期项目一场景中,一WebAPI(响应内容:7MB-40MB、数据项:5W-20W条)的网络传输耗时较大,短则5s,长则高达25s,前端渲染又需要耗时9s-60s。在这个场景中,前端的问题暂且不表。那么针对后端的问题,个人认为还是有较大的优化空间:1)启用HTTP内容压缩策略【最重要】2)调整数据......
  • vue3 封装request请求
    vue3原生请求封装我这里用一个案例来解释需求:把vue3原生的静态页集成到vue2的若依项目并且可以访问vue2接口在vue3src下的utils下创建文件request.ts文件importaxiosfrom"axios";import{showMessage}from"./status";//引入状态码import{ElMess......
  • Unity数据持久化——序列化/二进制/Json/PlayerPrefs
    序列化序列化是指把对象转换为字节序列的过程,而反序列化是指将字节序列恢复为对象的过程。序列化最主要的用途就是传递对象和保存对象。在Unity中保存和加载、prefab、Scene、Inspector窗口、实例化预制体等都使用了序列化和反序列化。下面是一个序列化和反序列化的例子......
  • Laravel序列化解码:深入Eloquent模型的序列化机制
    Laravel序列化解码:深入Eloquent模型的序列化机制引言Laravel作为一门优雅的PHPWeb开发框架,提供了许多便利的功能来简化开发过程。其中一个强大而易用的功能便是模型的序列化。序列化是将对象状态转换为可以存储或传输的格式的过程。在Laravel中,EloquentORM支持模型的自......
  • Java中的反序列化漏洞及其防护措施
    Java中的反序列化漏洞及其防护措施大家好,我是微赚淘客系统3.0的小编,是个冬天不穿秋裤,天冷也要风度的程序猿!今天我们来探讨Java中的反序列化漏洞及其防护措施。反序列化漏洞是由不安全的对象反序列化引起的,攻击者可以通过精心构造的恶意数据流进行攻击,导致远程代码执行和其他安全......
  • Json 序列化、反序列化;重复或循环使用时注意事项
    Json序列化问题publicclassTest2{publicstaticvoidmain(String[]args)throwsJsonProcessingException{ObjectMapperobjectMapper=newObjectMapper();objectMapper.setSerializationInclusion(JsonInclude.Include.NON_NULL);Plug......
  • 使用“marshmallow-sqlalchemy”时发生错误,异常:反序列化需要会话
    使用marshmallow-sqlalchemy反序列化对象,但出现错误。我已经通过了session对象,也就是数据库DB,但是还是没有效果,这个问题已经2天了,依然无法解决。my_db.pyfromsqlalchemyimportcreate_enginefromsqlalchemy.ext.declarativeimportdeclarative_basefromsqlalchemy.o......
  • 将 JSON 发送到 Flask,request.args 与 request.form
    我的理解是,request.argsFlask中包含来自GET请求的URL编码参数,而request.form包含POST数据。我很难理解为什么在发送POST请求时,尝试使用request.form访问数据会返回400错误,但是当我尝试使用request.args......
  • 如何在 FastAPI 中间件中以不同方式捕获或处理 RequestValidationError 异常?
    如何正确组合RequestValidationError异常处理程序,如:@app.exception_handler(RequestValidationError)asyncdefvalidation_exception_handler(request,exc):response=prepare_response({},g_ERROR__INCORRECT_PARAMS)returnJSONResponse(content=re......