Django-rest-framework学习(二)Request与Response
2016-03-30 23:34
701 查看
Django-rest-framework学习(二)Request与Response
标签(空格分隔): Django web-api pythonDjango-rest-framework学习二Request与Response
组件
Request对象
Response对象
状态码 Status codes
包装API视图
组合组件
更改视图文件
提供可选择的格式化的URL后缀
响应输出
总结
组件
Request对象
django-rest-framework中的Request对象扩展了常规的HttpRequest,它提供了request.data属性,与request.POST很类似,但是更为实用与灵活。request.POST #只能处理POST方法提交的表格数据 request.data #支持处理多种方法提交的任意类型的数据
Response对象
它同时提供了response对象,是一种基于TemplateResponse类型的,可以将未处理的内容通过内容协商来决定返回给客户端的正确内容形式。( 即客户端所需要的正确形式返回,要什么样的给什么样的,不知道理解的对不对)return Response(data)
状态码 Status codes
由于状态码直接在代码中显示不利于代码的可读性,Django-rest-framework提供了一种更为直观的状态显示,比如HTTP_400_BAD_REQUEST。包装API视图
@api_view包装器用于基于函数或接口的视图APIView类用于类视图
组合组件
更改视图文件
移除JSONResponse类,因为request.data可以是任意类型的数据,最终都会被处理正确响应给客户端,修改views.py如下:#coding:utf-8 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): ''' 显示所有的snippets的对象,或者创建一个新的对象 ''' if request.method == 'GET': snippets = Snippet.objects.all() serializers = SnippetSerializer(snippets, many=True) return Response(serializers.data) elif request.method == 'POST': # data = JSONParser().parse(request) serializers = SnippetSerializer(data=request.data) if serializers.is_valid(): serializers.save() return Response(serializers.data, status=status.HTTP_201_CREATED) return Response(serializers.errors, status=status.HTTP_400_BAD_REQUEST) @api_view(['GET','PUT','DELETE']) def snippet_detail(request, pk): ''' 查找、更新或者删除一个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)
修改过后,代码显得更加简洁,且状态更为直观。
提供可选择的格式化的URL后缀
提供可选择的格式化的URL后缀,意味着我们提供的API需要能够正确的响应响应的URL,比如:http://example.com/api/items/4/.json只需要我们在接口定义处加上关键字format,例如下面:
def snippet_list(request, format=None) def snippet_detail(request, pk, format=None)
同时还要更新urls.py,除了原有的urlpatterns还需要增加format_suffix_patterns,如下:
#coding:utf-8 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)
响应输出
python manage.py runserver结果如下:
由上可知,我们的响应输出格式有以下2种:
- http://127.0.0.1:8000/snippets/?format=json
- http://127.0.0.1:8000/snippets/?format=api
同样的,我们可以控制我们的请求格式,通过Content-type Header设置,po s t传入application/json 数据或者post传入multipart/form-data数据进行更新或者创建.
总结
Django-rest-framework API这个中内容的响应方式是基于客户端的,体现了强大的web-browsable,使得web接口的输出更加富有表现力。相关文章推荐
- SICP(一):使用guile执行scheme代码
- UINavigationController改变UINavigationBar导航条标题颜色跟字体
- Android更新Ui线程的四个方法
- hdu-1806 Frequent values(RMQ,求区间最大频率)
- 在UE4的蓝图中创建一个自动销毁的Actor
- UIKit 框架之<UIScrollView>
- vector,list,deque三者的区别
- iOS UISearchController 搜索框
- iOS学习之UI初级————CGAffineTransform坐标系统变换以及UIView的属性动画
- POJ 3061 Subsequence
- Codeforces Round #316 (Div. 2)D. Tree Requests
- Codeforces Round #316 (Div. 2) D. Tree Requests(DFS序+BFS+二分)
- mysql创建table时出错 ERROR 1067 (42000): Invalid default value for ' '
- iOS小知识点(UI部分)
- UICollectionView
- 笔记 - 4、HTML - marquee
- Rescue
- Rescue
- [leetcode-334]Increasing Triplet Subsequence
- POJ 2299 Ultra-QuickSort(树状数组+离散化—求逆序数)