请求和响应 Requests and Responses

从这一片来说,我们将真正开始覆盖REST框架的核心。我们来介绍一些基本的构建块

Request objects

REST框架引入了一个Request扩展常规的对象HttpRequest,并提供更灵活的请求解析。Request对象的核心功能是request.data,和之类似的属性request.POST,但比request.POST更为有用。

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框架还引入了一个Response对象,它是一种类型的对象,它TemplateResponse使用未呈现的内容并使用内容协商来确定返回给客户端的正确内容类型。

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

状态码

在视图中使用数字HTTP状态代码并不易见的阅读,并且如果代码错误,并不很容易注意到。REST框架为每个状态代码提供更明确的标识符,例如HTTP_400_BAD_REQUEST在status模块中。这是一个好主意,而不是使用数字标识符。

封装的API视图

REST框架提供了两个可用于编写API视图的包装器。

@api_view用于处理基于函数的视图的装饰器。

该APIView班与基于类的视图工作。

这些包装提供了一些功能,例如确保Request在视图中接收实例,并向Response对象添加上下文,以便可以执行内容协商。

这些包装器还提供了一些行为,例如405 Method Not Allowed在适当时返回响应,以及处理ParseError在request.data格式错误的输入中访问时发生的任何异常。

实战

好的,让我们继续,开始使用这些新的组件。

让我们重新编写上面关于序列化的项目,重新编写上面view里面的内容


from rest_framework import status
from rest_framework.decorators import api_view
from rest_framework.response import Response
from snippets.models import Snippet
from snippets.serializers import SnippetSerializer @api_view(['GET', 'POST'])
def snippet_list(request, format=None):
"""
List all code snippets, or create a new snippet.
"""
if request.method == 'GET':
snippets = Snippet.objects.all()
serializer = SnippetSerializer(snippets, many=True)
return Response(serializer.data) elif request.method == 'POST':
serializer = SnippetSerializer(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 snippet_detail(request, pk, format=None):
"""
Retrieve, update or delete a code snippet.
"""
try:
snippet = Snippet.objects.get(pk=pk)
except Snippet.DoesNotExist:
return Response(status=status.HTTP_404_NOT_FOUND) if request.method == 'GET':
serializer = SnippetSerializer(snippet)
return Response(serializer.data) elif request.method == 'PUT':
serializer = SnippetSerializer(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)

测试


http http://127.0.0.1:8000/snippets/ HTTP/1.1 200 OK
...
[
{
"id": 1,
"title": "",
"code": "foo = \"bar\"\n",
"linenos": false,
"language": "python",
"style": "friendly"
},
{
"id": 2,
"title": "",
"code": "print \"hello, world\"\n",
"linenos": false,
"language": "python",
"style": "friendly"
}
]

我们可以通过使用Accept头来控制返回的响应的格式

http http://127.0.0.1:8000/snippets/ Accept:application/json  # Request JSON
http http://127.0.0.1:8000/snippets/ Accept:text/html # Request HTML

或者通过附加格式后缀

http http://127.0.0.1:8000/snippets.json  # JSON suffix
http http://127.0.0.1:8000/snippets.api # Browsable API suffix
# POST using form data
http --form POST http://127.0.0.1:8000/snippets/ code="print 123" {
"id": 3,
"title": "",
"code": "print 123",
"linenos": false,
"language": "python",
"style": "friendly"
} # POST using JSON
http --json POST http://127.0.0.1:8000/snippets/ code="print 456" {
"id": 4,
"title": "",
"code": "print 456",
"linenos": false,
"language": "python",
"style": "friendly"
}

最新文章

  1. 设置EditText光标位置
  2. FluentData Mysql分页的一个BUG
  3. C#调用脚本语言(三)-- IronJS 与 IronLua 简单方法性能比较
  4. emWin(ucGui) MULTIEDIT控件的按键响应处理 worldsing
  5. c#怎么把byte转化成int
  6. HTML 5中的文件处理之FileAPI(转载)
  7. 通过使用Chrome的开发者工具来学习JavaScript
  8. C陷阱与缺陷(二)
  9. Android异步载入全解析之使用多线程
  10. Cocos2d-x学习笔记(1)
  11. Gradle构建多模块项目(转)
  12. Learn Plan
  13. python中单例模式的四种实现方式
  14. vue2+webpack 移动生态 常用依赖
  15. 解决Python2.7的UnicodeEncodeError: ‘ascii’ codec can’t encode异常错误
  16. xnconvert 图片转换工具
  17. rubymine debug需要安装依赖
  18. Android 截取屏幕图片并保存
  19. mysql系统变量
  20. 遍历json数组实现树

热门文章

  1. Spring注解@Repository、@Service、@Controller、@Component
  2. 日志输出最不重要的就是控制台输出,控制台输出就是system.out而已
  3. 项目结构、包、编译为exe!
  4. Java程序猿的JavaScript学习笔记(9—— jQuery工具方法)
  5. YII用户注冊和用户登录(三)之模型中规则制定和分析
  6. CentOS6.8 安装 mysql 5.6
  7. JavaScript和Java的区别
  8. Oracle-基本SQL语句
  9. 第6章 服务模式 Service Interface(服务接口)
  10. webpack打包css自动添加css3前缀