一、先看例子
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 开启访问
二、请求对象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")
2.2 request.data
可以接受任意类型的数据。
2.2.1 GET的form-data写法
后端代码如下
@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)
输出结果如下
可以得到request.Data
是一个QueryDict字典,然后根据key进行获取对应的参数。他的参数是拼接在url中传递过来的
2.2.2 GET的x-www-form-urlencoded写法
输出结果如下
2.2.3 GET的json写法
输出结果如下
从结果上来看,已经不是QueryDict了,而直接是一个字典了,但是获取参数的方式不变。
2.2.4 POST的`form-data`写法
后端代码如下
@api_view(["POST"])
def postNews(request):
reqData = request.data
print(reqData)
print(reqData['name'])
print(reqData.get('name'))
return Response("ok")
结果输出如下:
2.2.5 POST的x-www-form-urlencoded写法
输出结果如下
2.2.6 POST的json写法
输出结果如下
从结果上来看,已经不是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")
运行结果
三、响应对象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