博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
DRF教程2-请求和响应
阅读量:5732 次
发布时间:2019-06-18

本文共 2841 字,大约阅读时间需要 9 分钟。

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.

  

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

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

  

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

 

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

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

2 APIView类在类视图中使用

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

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

 

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

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

from rest_framework import statusfrom rest_framework.decorators import api_viewfrom rest_framework.response import Responsefrom .models import Coursefrom .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_patternsfrom courses import viewsurlpatterns = [    path('course/', views.course_list,name='course_list'),    path('course/
/', 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 suffixhttp http://127.0.0.1:8000/course.api   # Browsable API suffix

  

转载于:https://www.cnblogs.com/jabbok/p/10558807.html

你可能感兴趣的文章
REST技术第三步 @BeanParam的使用
查看>>
模板 读入挂!
查看>>
SharePoint 读取 Site Columns 的数据并绑定到DropdownList
查看>>
Python中的对象行为与特殊方法(二)类型检查与抽象基类
查看>>
使用 axios 详解
查看>>
通信基站(dfs回溯,思维)
查看>>
nginx web加密访问
查看>>
iOS - Regex 正则表达式
查看>>
SYS_CONTEXT函数返回IP地址的一些误解
查看>>
第 68 章 Logical Volume Manager (LVM)
查看>>
膝盖中了一箭之康复篇-第八个月暨2月份目标总结
查看>>
IPA提交APPStore问题记录(一)
查看>>
有利于seo优化的网站地图不能取巧
查看>>
快照产品体验优化
查看>>
ASCII
查看>>
ibatis SqlMap not found
查看>>
Android SD卡创建文件和文件夹失败
查看>>
Ubuntu 14.04 vsftp refusing to run with writable root inside chroot问题解决方法
查看>>
Intellij IDEA远程调试tomcat
查看>>
hadoop的学习论坛
查看>>