Django REST framework 第二章 Request and Response
此章节开始真正的撰写REST framework的核心代码,介绍一系列必要的建立设计
Request Objects
REST framework介绍了一个Request对象用来扩展常规的HttpRequest,提供了更多灵活的请求解析。Request对象的核心功能是request.data属性跟request.POST非常相似,但是在WEB APIs方面更能发挥作用。
request.POST # 只处理表单数据,只能用于POST方法
request.data # 处理任意的数据,作用于POST、PUT、PATCH方法
Response Objects
REST framework还引入了一个响应对象Response,它是一种TemplateResponse类型,采用没有render内容和使用内容协商来确定正确的内容类型并返回给客户端.
return Response(data) # 转换到客户端需要的内容类型Renders to content type as requested by the client.
Status codes
使用数字HTTP状态码在你的视图内不会总是被明显的阅读到,并且很容易不被注意到,如果你拿到了一个错误的错误代码。REST framework提供了更多明确的标识符为每一个状态码,比如HTTP_400_BAD_REQUEST在状态模块单元里。相比于使用数字标识符,广泛使用这些是一个更好的主意。
Wrapping API views
REST framework提供了2种你可以使用来写API 视图的包装:
1、@api_view装饰器为FBV服务
2、APIView类为CBV服务
这些封装提供了一些功能,比如确定你能接受到Request实例在视图中,添加上下文到Response对象从而可以进行内容协商转换。此外还提供了一些行为,比如返回405 Method Not Allowed返回值在合适的时候,当访问的request.data是很畸形的输入时处理任何ParseError错误
Pulling it all together
好了,现在开始使用这些新组件写一些视图。
views.py文件中再不需要JSONResponse类,所以继续并删除掉它。一旦完成,就可以开始稍微重构视图。
from app01.models import Snippet
from app01.serializers import SnippetSerializer
from rest_framework import status
from rest_framework.decorators import api_view
from rest_framework.response import Response @api_view(['GET', 'POST'])
def snippet_list(request):
"""
List all code snippets, or create a new snippet.
"""
if request.method == 'GET':
snippets = Snippet.objects.all()
serializer = SnippetSerializer(snippets, many=True) # queryset对象,配合many=True
return Response(serializer.data) elif request.method == 'POST':
serializer = SnippetSerializer(data=request.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。我们也在使用被命名的状态码,这会让返回的含义更加明显。
@api_view(['GET', 'PUT', 'DELETE'])
def snippet_detail(request, pk):
"""
获取、更新、删除
"""
try:
snippet = Snippet.objects.get(pk=pk) # model类单个对象实例
except Snippet.DoesNotExist:
return Response(status=status.HTTP_404_NOT_FOUND) # 未获取到信息 if request.method == 'GET':
serializer = SnippetSerializer(snippet)
return Response(serializer.data) # response内部解决了序列化问题 不需要再写JsonResponse(serializer.data, safe=False) elif request.method == 'PUT':
serializer = SnippetSerializer(snippet, data=request.data) # 跟form里面的更新操作也很类似
if serializer.is_valid():
serializer.save()
return Response(serializer.data) # 单个对象的data是一个字典,多个对象的是list,需要safe=False
return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST) elif request.method == 'DELETE':
snippet.delete()
return Response(status=status.HTTP_204_NO_CONTENT) # 成功 没有数据
这应该会让你感觉很熟悉,跟普通Django内部的视图没有太大差异。
注意,我们不再明确给request或者response打上一个明确的内容类型. request.data可以处理即将到来的json请求,但它也可以处理其他格式的. 相似地也会返回带有数据的respose对象,但是允许REST framework为我们去转换response到正确的类型。
Adding optional format suffixes to our URLs
为了充分利用,事实上返回不在与单个内容类型硬连线,让我们添加对API端点的格式后缀的支持。使用格式后缀能显式地引用给定格式的URLs,意味着API将会能够处理URLs,比如http://example.com/api/items/4.json
在之前的两个视图内都加上关键字参数format
def snippet_list(request, format=None):
.... def snippet_detail(request, pk, format=None):
....
更新app内的url文件
from app01 import views
from django.urls import path, include
from rest_framework.urlpatterns import format_suffix_patterns app_name = 'app01'
urlpatterns = [
path('snippets/', views.snippet_list),
path('snippets/<int:pk>/', views.snippet_detail),
]
urlpatterns = format_suffix_patterns(urlpatterns)
我们不一定要加上这些额外的URL模式,但它为我们提供了一个简单的,指特定格式的清洁方式。
如果按照之前的章节一步步做到这个遇到下面这个问题,请到setting里面把REST_FRAMEWORK注释掉,因为将之前的视图注释掉了,没有用到Django内置的auth,具体说不清,但是确实是那边功能缺失。

注释掉此段:
# REST_FRAMEWORK = {
# # Use Django's standard `django.contrib.auth` permissions,
# # or allow read-only access for unauthenticated users.
# 'DEFAULT_PERMISSION_CLASSES': [
# 'rest_framework.permissions.DjangoModelPermissionsOrAnonReadOnly'
# ]
# }
测试成效

测试一下下面的后缀
http http://127.0.0.1:8000/app01/snippets/ Accept:application/json # Request JSON
http http://127.0.0.1:8000/app01/snippets/ Accept:text/html # Request HTML
http http://127.0.0.1:8000/app01/snippets.json # JSON suffix
http http://127.0.0.1:8000/app01/snippets.api # Browsable API suffix

相似的,我们可以控制发送的请求的格式,使用Content-Type 头。


http --json POST http://127.0.0.1:8000/app01/snippets/ "code=11"
如果添加--debug在上面的额http请求,你讲可以看到请求类型在请求头里面。同样的也可以在web浏览器里访问
Django REST framework 第二章 Request and Response的更多相关文章
- DRF (Django REST framework) 中的Request 与 Response
DRF中的Request 与 Response 1. Request - REST framework 传入视图的request对象不再是Django默认的HttpRequest对象,而是REST f ...
- 徒手用Java来写个Web服务器和框架吧<第二章:Request和Response>
徒手用Java来写个Web服务器和框架吧<第一章:NIO篇> 接上一篇,说到接受了请求,接下来就是解析请求构建Request对象,以及创建Response对象返回. 多有纰漏还请指出.省略 ...
- Django REST framework 第一章 Serialization
此章节将会介绍多种构成REST framework的重要模块,在每个部分如何一起配合上提供一个综合的全方面的了解. 准备 同样的创建一个新项目,创建一个新的app,将rest_framework跟新建 ...
- (转)Django学习之 第二章:Django快速上手
安装Python 安装Django非常容易.因为Django可以运行在任何可以运行Python的环境中,所以可以以多种方式进行配置. 在本章我们将尝试覆盖几种常见的Django安装场景. Djang ...
- Django Rest framework 框架之认证使用和源码执行流程
用这个框架需要先安装: pip3 install djangorestframework 如果写了一个CBV的东西,继承了View. # 继承Django里面View class APIView(Vi ...
- django restframwork教程之Request和Response
从这一篇文章开始,我们会覆盖整个REST framwork框架的核心,接下来让我们介绍一些基础的构建块 Request 对象 REST framework 引入了一个扩展HttpRequest的请求对 ...
- Django restful Framework 之Requests and Response 方法
前言: 本章主要介绍REST framework 内置的必要的功能. Request objects Response objects Status codes Wrapping API views ...
- 《Django By Example》第二章 中文 翻译 (个人学习,渣翻)
书籍出处:https://www.packtpub.com/web-development/django-example 原作者:Antonio Melé (译者注:翻译完第一章后,发现翻译第二章的速 ...
- 第二章、Django以及数据库的配置
目录 第二章.Django以及数据库的配置 一.小白必会三板斧 二.静态文件配置 三.form表单 action和method参数可以写的形式 四.request对象及方法 五.django连接数据库 ...
随机推荐
- css之文本两端对齐
在进行网页设计时,我们经常会看到这样的样式:文本两端对齐. css为我们提供了一个属性可以实现这样的效果:text-align: justify.不过这个只能用来设置多行文本(除最后一行).如果只有单 ...
- 关于字符编码,你所需要知道的(ASCII,Unicode,Utf-8,GB2312…)
字符编码的问题看似很小,经常被技术人员忽视,但是很容易导致一些莫名其妙的问题.这里总结了一下字符编码的一些普及性的知识,希望对大家有所帮助. 还是得从ASCII码说起 说到字符编码,不得不说ASCII ...
- C++基础知识-Day5
今天主要讲的是类的扩展 1.类成员函数的存储方式 首先我们介绍类成员函数的存储方式,C++引入面向对象的概念之后,C语言中的一些比如static/const等原有语义,作一些升级,此时既要保持兼容,还 ...
- Tomcat 用 startup.bat 启动时,加载信息之后又关闭服务器(差不多一闪而过)问题
Tomcat 用 startup.bat 启动时,加载信息之后又关闭服务器(差不多一闪而过)问题 以前是正常的,后来在 server.xml 文件的 <Host> </Host> ...
- (二叉树 BFS) leetcode103. Binary Tree Zigzag Level Order Traversal
Given a binary tree, return the zigzag level order traversal of its nodes' values. (ie, from left to ...
- go的net/rpc用法
一:PRC是什么? RPC(Remote Procedure Call) 远程过程调用,是一个计算通信协议.该协议允许一台计算机上的程序调用另外一台计算机上的程序.远程过程调用就是2个不在同一台计算机 ...
- Ubuntu编译Protobuf(Base tensorflow-12)报错
报错1: dogepool@ubuntu-server:~/dogecoin$ ./autogen.sh./autogen.sh: 50: ./autogen.sh: autoreconf: not ...
- Java Web之表单重复提交问题
上篇文章讲了验证码的制作,提及到了一个问题,就是表单重复提交的问题,可能在上次那个验证码中感觉不是那么的重要 现在我新写一个例子,转钱.通过这个例子你就知道表单重复提交有多恐怖了. 先来简单的介绍一下 ...
- Spring项目集成ShiroFilter简单配置
Shiros是我们开发中常用的用来实现权限控制的一种工具包,它主要有认证.授权.加密.会话管理.与Web集成.缓存等功能.我是从事javaweb工作的,我就经常遇到需要实现权限控制的项目,之前我们都是 ...
- JVM 内存初学 堆(heap)、栈(stack)和方法区(method)
这两天看了一下深入浅出JVM这本书,推荐给高级的java程序员去看,对你了解JAVA的底层和运行机制有比较大的帮助.废话不想讲了.入主题:先了解具体的概念:JAVA的JVM的内存可分为3个区:堆(he ...