Django-14-DRF请求与响应

一、先看例子

1.1 序列化器

from datetime import datetime

from django.contrib.auth.models import Group, User
from rest_framework import serializers

from news.models import News

# 定义news的序列化器
class NewsSerializer(serializers.ModelSerializer):
    class Meta:
        model = News
        fields = '__all__'

1.2 视图函数

from rest_framework import permissions, viewsets
from rest_framework.response import Response
from rest_framework.viewsets import ModelViewSet
from rest_framework.decorators import api_view
from news.models import News
from news.serializers import NewsModelSerializer

# get请求,用于获取数据
@api_view(["GET"])
def getNews(request):
    news = News.objects.all()
    serializer = NewsModelSerializer(news, many=True)
    return Response(serializer.data)

# POST请求,用于提交数据
@api_view(["POST"])
def postNews(request):
    request_data = request.data
    serializer = NewsModelSerializer(data=request_data)
    if serializer.is_valid():
        serializer.save()
        return Response("ok")
    else:
        return Response(serializer.errors, status="500")

1.3 news的url.py

from django.urls import path
from rest_framework.routers import DefaultRouter

from news import views

urlpatterns = [
    path('getNews/', views.getNews),
    path('postNews/', views.postNews),
]

1.4 注册到根路由

urlpatterns = [
    path('news/', include('news.urls')),
]

1.5 开启访问

Django-14-DRF请求与响应
image.png

二、请求对象request

DRF框架引入了一个对象,扩展了常规的请求,并且提供灵活的请求解析。
例子中的写法,就是DRF的写法,但是有一些需要介绍的。

@api_view(["GET"])
def getNews(request):
    news = News.objects.all()
    serializer = NewsModelSerializer(news, many=True)
    return Response(serializer.data)

里面的getNews(request)中的request,不是Django提供的HttpRequest对象,而是DRF框架在django的基础上进行扩展的request请求对象。

2.1 request.POST

只能接受POST请求的数据。
后端代码

@api_view(["POST"])
def postNews(request):
    reqData = request.POST
    print(reqData)
    print(reqData['name'])
    print(reqData.get('name'))
    return Response("ok")
Django-14-DRF请求与响应
image.png


Django-14-DRF请求与响应
image.png

2.2 request.data

可以接受任意类型的数据。

2.2.1 GET的form-data写法

Django-14-DRF请求与响应
image.png


后端代码如下


@api_view(["GET"])
def getNews(request):
    reqData = request.data
    print(reqData)
    print(reqData['name'])
    print(reqData.get('name'))
    news = News.objects.all()
    serializer = NewsModelSerializer(news, many=True)
    return Response(serializer.data)

输出结果如下

Django-14-DRF请求与响应
image.png


可以得到request.Data是一个QueryDict字典,然后根据key进行获取对应的参数。他的参数是拼接在url中传递过来的


2.2.2 GET的x-www-form-urlencoded写法

Django-14-DRF请求与响应
image.png


输出结果如下

Django-14-DRF请求与响应
image.png

2.2.3 GET的json写法

Django-14-DRF请求与响应
image.png


输出结果如下

Django-14-DRF请求与响应
image.png


从结果上来看,已经不是QueryDict了,而直接是一个字典了,但是获取参数的方式不变。


2.2.4 POST的`form-data`写法

Django-14-DRF请求与响应
image.png


后端代码如下


@api_view(["POST"])
def postNews(request):
    reqData = request.data
    print(reqData)
    print(reqData['name'])
    print(reqData.get('name'))
    return Response("ok")

结果输出如下:

Django-14-DRF请求与响应
image.png

2.2.5 POST的x-www-form-urlencoded写法

Django-14-DRF请求与响应
image.png


输出结果如下

Django-14-DRF请求与响应
image.png

2.2.6 POST的json写法

Django-14-DRF请求与响应
image.png


输出结果如下

Django-14-DRF请求与响应
image.png


从结果上来看,已经不是QueryDict了,而直接是一个字典了,但是获取参数的方式不变。


2.2.7 总结

request.data对于GET POST请求,在不同请求体下获取参数的方式是一致的。

2.3 query_params等同于request.GET

后端写法

@api_view(["GET"])
def getNews(request):
    reqData = request.GET
    print(reqData)
    print(reqData['name'])
    print(reqData.get('name'))
    return Response("OK")
@api_view(["GET"])
def getNews(request):
    reqData = request.query_params
    print(reqData)
    print(reqData['name'])
    print(reqData.get('name'))
    return Response("OK")
Django-14-DRF请求与响应
image.png


运行结果

Django-14-DRF请求与响应
image.png

三、响应对象Response

响应对象,是DRF对Django的HttpResponse对象的扩展,用于前后端分离的数据的响应。
看一下Response类的初始化方法

def __init__(self, data=None, status=None,
                 template_name=None, headers=None,
                 exception=False, content_type=None)
:

返回给前段时可以传递的参数如上。

参数 说明
data 返回的数据,内部会进行序列化,需传入一个字典
status 返回的状态码,默认是200
template_name 渲染并返回的模板
headers 返回的响应头,可以组织一个字典往响应头中放入token信息等
content_type 响应的编码格式,入application/json以及text/html等
def myResponse(request):
    ret_Msg = {"status":"100","message":""}  # 返回的信息
    return Response(
        data=ret_Msg,
        status=200# 代表成功
        headers={"token":"xxxx"},
    )

如果与序列化器关联,可以参考如下写法

@api_view(["POST"])
def postNews(request):
    serializer = NewsModelSerializer(data=request.data)
    # 序列化验证
    if serializer.is_valid():
        # 保存到model
        serializer.save()
        # 返回响应数据
        return Response(serializer.data, status=status.HTTP_201_CREATED)
    # 当出现错误后,可以直接返回序列化验证的错误信息
    return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)


原文始发于微信公众号(Python之家):Django-14-DRF请求与响应

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/198074.html

(0)
小半的头像小半

相关推荐

发表回复

登录后才能评论
极客之音——专业性很强的中文编程技术网站,欢迎收藏到浏览器,订阅我们!