Request objects

REST framework中有一个Request对象,是HttpRequest的扩展,提供了新的请求解析,Request的核心功能就是request.data,它和request.POST相似,但是在web API中更为有效

request.POST  # Only handles form data.  Only works for 'POST' method.
request.data # Handles arbitrary data. Works for 'POST', 'PUT' and 'PATCH' methods.

  

Response objects

REST framework中还有一个Response对象,是一种TemplateResponse ,拿到原始数据并以正确的类型返回给客户端。

return Response(data)  # Renders to content type as requested by the client.

  

Status codes

在你的视图中,使用数字HTTP状态码不好读,rest使用了更明确的标识符,比如HTTP_400_BAD_REQUEST 。

Wrapping API views

rest提供了两种写API视图的包装。

1 @api_view装饰器在函数视图中使用

2 APIView类在类视图中使用

这些包装器提供了一些功能,比如确认在你的视图中接收到了Request实例,并且把上下文添加到Response对象中。

包装器也可以返回405 Method Not Allowed,也可以处理任何在访问有错误的request.data时产生的ParseError 异常

Pulling it all together

以上的组件可以使我们重写views。

我们不再需要在views.py加入JSONResponse 类,而是稍微重构views

from rest_framework import status
from rest_framework.decorators import api_view
from rest_framework.response import Response from .models import Course
from .serializer import CourseSerializer @api_view(["GET","POST"])
def course_list(request,format=None):
"""
List all courses, or create a new course.
"""
if request.method == 'GET':
courses = Course.objects.all()
serializer = CourseSerializer(courses,many=True)
return Response(serializer.data) elif request.method == 'POST':
serializer = CourseSerializer(data=request.data)
if serializer.is_valid():
serializer.save()
return Response(serializer.data,status=status.HTTP_201_CREATED)
return Response(serializer.errors,status=status.HTTP_400_BAD_REQUEST) @api_view(['GET', 'PUT', 'DELETE'])
def course_detail(request, pk, format=None):
"""
Retrieve, update or delete a course.
"""
try:
snippet = Course.objects.get(pk=pk)
except Course.DoesNotExist:
return Response(status=status.HTTP_404_NOT_FOUND) if request.method == 'GET':
serializer = CourseSerializer(snippet)
return Response(serializer.data) elif request.method == 'PUT':
serializer = CourseSerializer(snippet, data=request.data)
if serializer.is_valid():
serializer.save()
return Response(serializer.data)
return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST) elif request.method == 'DELETE':
snippet.delete()
return Response(status=status.HTTP_204_NO_CONTENT)

  

from rest_framework.urlpatterns import format_suffix_patterns
from courses import views urlpatterns = [
path('course/', views.course_list,name='course_list'),
path('course/<int:pk>/', views.course_detail,name='course_detail'),
]
urlpatterns = format_suffix_patterns(urlpatterns)
#在views中的函数加入format参数,然后咋url中使用格式后缀模型,对url进行转换,就可以使用带后缀的url请求。

  

http http://127.0.0.1:8000/course.json  # JSON suffix
http http://127.0.0.1:8000/course.api # Browsable API suffix

  

DRF教程2-请求和响应的更多相关文章

  1. Django REST FrameWork中文教程2:请求和响应

    从这一点开始,我们将真正开始覆盖REST框架的核心.我们来介绍几个基本的构建块. 请求对象REST框架引入了Request扩展常规的对象HttpRequest,并提供更灵活的请求解析.Request对 ...

  2. drf中的请求与响应

    请求与响应(3星) 请求:Request REST framework 传入视图的request对象不再是Django默认的HttpRequest对象,而是REST framework提供的扩展了Ht ...

  3. DRF视图-请求与响应

    DRF视图 drf的代码简写除了在数据序列化体现以外,在视图中也是可以的.它在django原有的django.views.View类基础上,drf内部封装了许多子类以便我们使用. Django RES ...

  4. DRF对Django请求响应做了技术升级

    Django视图是用来处理请求和响应的,Django默认是按Form和Template来设计的,如果要处理以JSON格式为主的RESTful API,那么就需要对Django请求和响应的处理代码进行优 ...

  5. Spring Boot 2.x基础教程:如何扩展XML格式的请求和响应

    在之前的所有Spring Boot教程中,我们都只提到和用到了针对HTML和JSON格式的请求与响应处理.那么对于XML格式的请求要如何快速的在Controller中包装成对象,以及如何以XML的格式 ...

  6. 《吐血整理》进阶系列教程-拿捏Fiddler抓包教程(13)-Fiddler请求和响应断点调试

    1.简介 Fiddler有个强大的功能,可以修改发送到服务器的数据包,但是修改前需要拦截,即设置断点.设置断点后,开始拦截接下来所有网页,直到取消断点.这个功能可以在数据包发送之前,修改请求参数:在收 ...

  7. CoolBlog开发笔记第5课:请求与响应

    教程目录 1.1 CoolBlog开发笔记第1课:项目分析 1.2 CoolBlog开发笔记第2课:搭建开发环境 1.3 CoolBlog开发笔记第3课:创建Django应用 1.4 CoolBlog ...

  8. drf 教程

    1, 序列化 Serialization 创建一个新环境 在做其他事之前,我们会用virtualenv创建一个新的虚拟环境.这将确保我们的包配置与我们正在工作的其他项目完全隔离. virtualenv ...

  9. Spring Boot中如何扩展XML请求和响应的支持

    在之前的所有Spring Boot教程中,我们都只提到和用到了针对HTML和JSON格式的请求与响应处理.那么对于XML格式的请求要如何快速的在Controller中包装成对象,以及如何以XML的格式 ...

  10. Django:学习笔记(4)——请求与响应

    Django:学习笔记(4)——请求与响应 0.URL路由基础 Web应用中,用户通过不同URL链接访问我们提供的服务,其中首先经过的是一个URL调度器,它类似于SpringBoot中的前端控制器. ...

随机推荐

  1. 在iOS平台使用ffmpeg解码h264视频流(转)

    在iOS平台使用ffmpeg解码h264视频流,有需要的朋友可以参考下. 对于视频文件和rtsp之类的主流视频传输协议,ffmpeg提供avformat_open_input接口,直接将文件路径或UR ...

  2. React + webpack 环境配置

    安装配置Babel babel-preset-es2015 ES6语法包,使代码可以随意地使用ES6的新特性. babel-preset-react React语法包,专门用于React的优化,在代码 ...

  3. spring+mybatis项目整合

    前辈总结的很详细,贴出链接,参考学习 http://www.open-open.com/lib/view/open1392252233301.html

  4. ansible 基础知识

    英文官网,值得拥有! http://docs.ansible.com/ansible/list_of_files_modules.html# 摘自: http://blog.csdn.net/b624 ...

  5. Normalize.css 与传统的 CSS Reset 有哪些区别?

    CSS Reset 是革命党,CSS Reset 里最激进那一派提倡不管你小子有用没用,通通给我脱了那身衣服,凭什么你 body 出生就穿一圈 margin,凭什么你姓 h 的比别人吃得胖,凭什么你 ...

  6. Spring MVC 和 Struts2 的区别?

    1.请求拦截级别 struts2框架是类级别的拦截,每次来了请求就创建一个Action,然后调用setter getter方法把request中的数据注入 struts2实际上是通过setter ge ...

  7. 浏览器端JS导出EXCEL——001

    <script src="https://rawgithub.com/eligrey/FileSaver.js/master/FileSaver.js" type=" ...

  8. [HNOI 2010] 弹飞绵羊

    [题目链接] https://www.lydsy.com/JudgeOnline/problem.php?id=2002 [算法] LCT动态维护森林连通性 时间复杂度 : O(NlogN ^ 2) ...

  9. Python批量操作Linux服务器执行命令

    #-*- coding: utf-8 -*- #!/usr/bin/python import paramiko import threading def ssh2(ip,username,passw ...

  10. bzoj4804

    莫比乌斯反演 我不会推线性筛 留坑