教程2--请求和响应
2017-03-16 09:20
106 查看
教程2–请求和响应
tips:本文纯属瞎翻译,还加了一点自己的理解。大家参考就好。这里说的请求和响应是指扩展了Django的REST框架的请求和响应。
请求对象
Request对象拓展了HttpRequest对象。并且提供了更加灵活的请求解析。Request的核心功能是
request.data,这个和
request.POST比较类似,但是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继承了TemplateResponse。它使用一种叫做内容协商的工具来决定如何渲染数据。
状态码
纯数字的状态码阅读性很差,所以REST框架提供了一些可读性较高的状态码表示,例如:在status模块中的
HTTP_400_BAD_REQUEST。
包装API views
REST框架提供了两种包装方式:使用
@api_view装饰器——适用于基于函数的视图。
使用APIView类——适用于基于类的视图。
包装API views的主要作用是将Request替换成REST框架的请求对象,并且为Response添加上下文信息,这个上下文信息中就包含着内容协商,以此,Response可以渲染数据。
包装类还提供了一些很方便的用途,例如自动返回错误状态码等。
开工!
上面说了一大堆理论,下面开始用一下试试看。因为我们现在直接使用REST框架的Response了,所以不需要再用JSONResponse了,把它干掉!
# coding=utf-8 from rest_framework import status from rest_framework.decorators import api_view from rest_framework.parsers import JSONParser from rest_framework.response import Response from snippets.models import Snippet from snippets.serializers import SnippetSerializer @api_view(["GET", "POST"]) def snippet_list(request): if request.method == 'GET': snippets = Snippet.objects.all() serializer = SnippetSerializer(snippets, many=True) return Response(serializer.data) elif request.method == 'POST': data = JSONParser().parse(request) serializer = SnippetSerializer(data=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): 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': data = JSONParser().parse(request) # 如果需要更新(调用update方法),则需要传入一个已经存在的模型实例! serializer = SnippetSerializer(snippet, data=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)
现在的代码看起来更简洁了一些,而且可读性也很好。
通过使用REST的Response我们可以将响应渲染成任意格式。
为URL添加可选的格式后缀
为了证明现在的返回格式可以是灵活多变的了,我们来看下这个例子。首先,要为视图函数添加参数format:
def snippet_list(request, format=None): ... def snippet_detail(request, pk, format=None): ...
然后修改
urls.py:
from django.conf.urls import url from rest_framework.urlpatterns import format_suffix_patterns from snippets import views urlpatterns = [ url(r'^snippets/$', views.snippet_list), url(r'^snippets/(?P<pk>[0-9]+)$', views.snippet_detail), ] urlpatterns = format_suffix_patterns(urlpatterns)
我们可以使用Httpie进行测试
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
对浏览器的支持
由于REST框架的响应值形式是根据请求的content-type来的,浏览器默认的请求就是html,所以返回的都是html类型的数据。这其实是一个巨大的提高,这样我们开发和调试接口更方便了,而且那些不懂技术但是却要检查我们API正确性的人也能看得懂了。下一章
下一章我们来讲基于类的视图,一起来看看如何使用通用视图来缩减代码量。相关文章推荐
- [四天学会ajax] 学习Ajax教程第三天,Ajax 中的高级请求和响应
- [四天学会ajax] 学习Ajax教程第三天,Ajax 中的高级请求和响应(下)
- 微信公共号开发教程java版——请求消息,响应消息及事件消息类的封装(三)
- 学习Ajax教程第三天[Ajax 中的高级请求和响应]
- Django REST FrameWork中文教程2:请求和响应
- Scrapy爬虫入门教程十一 Request和Response(请求和响应)
- [四天学会ajax] 学习Ajax教程第三天,Ajax 中的高级请求和响应
- OAuth 2.0系列教程(十) 资源拥有者密钥证书授权请求和响应
- OAuth 2.0系列教程(九) 契约请求和响应
- Django REST FrameWork中文教程2:请求和响应
- OAuth 2.0系列教程(九) 契约请求和响应
- [四天学会ajax] 学习Ajax教程第三天,Ajax 中的高级请求和响应(上)
- OAuth 2.0系列教程(七) 请求和响应
- Android基础入门教程——7.1.2 Android Http请求头与响应头的学习
- Django框架的使用教程路由请求响应的方法
- Django REST framework教程二: 请求和响应
- Part 1:请求与响应--Django从入门到精通系列教程
- [Ajax 完整教程]-第 3 页 Ajax 中的高级请求和响应
- OAuth 2.0系列教程(七) 请求和响应
- [四天学会ajax] 学习Ajax教程第三天,Ajax 中的高级请求和响应