Django前后端分离实践之DRF--04-阿里云开发者社区

开发者社区> 开发与运维> 正文

Django前后端分离实践之DRF--04

简介: 一、请求和响应 1. 请求对象(Request objects)拓展了Django自带的HttpRequest REST框架引入了一个扩展了常规HttpRequest的Request对象,并提供了更灵活的请求解析。

一、请求和响应

1. 请求对象(Request objects)拓展了Django自带的HttpRequest

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

request.POST  # 只处理表单数据  只适用于'POST'方法
request.data  # 处理任意数据  适用于'POST','PUT'和'PATCH'方法

2. 响应对象(Response objects)

REST框架还引入了一个Response对象,这是一种获取未渲染(unrendered)内容的TemplateResponse类型,并使用内容协商来确定返回给客户端的正确内容类型。

return Response(data)  # 渲染成客户端请求的内容类型。

3. 状态码(Status codes)

在你的视图(views)中使用纯数字的HTTP 状态码并不总是那么容易被理解。而且如果错误代码出错,很容易被忽略。REST框架为status模块中的每个状态代码(如HTTP_400_BAD_REQUEST)提供更明确的标识符。使用它们来代替纯数字的HTTP状态码是个很好的主意。

4. 包装(wrapping)API视图

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

1. 用于基于函数视图的@api_view装饰器。

2. 用于基于类视图的APIView类。

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

包装器还提供了诸如在适当时候返回405 Method Not Allowed响应,并处理在使用格式错误的输入来访问request.data时发生的任何ParseError异常。

二、应用

1. 导入模块

from .models import Publisher
from rest_framework.decorators import api_view
from app01 import serializers
from rest_framework.response import Response

2. 编写视图

  • GET
from .models import Publisher
from rest_framework.decorators import api_view
from app01 import serializers
from rest_framework.response import Response


# 列表里面的参数是被允许的操作,比如只有GET/POST请求,如果不是get或者post会报405--->405 Method Not Allowed
@api_view(['GET', 'POST'])
def publisher_list(request):
    """
    列出所有出版社,get
    或者创建一个新的出版社 post
    """
    if request.method == 'GET':
        # 所有的出版社
        queryset = Publisher.objects.all()
        # 把所有从数据库取出来的出版社信息数据进行序列化
        s = serializers.PublisherSerializer(queryset, many=True)
        return Response(s.data)
  • POST
     if request.method == 'POST':
        # post请求就是---->创建出版社
        # 跟上面不同,从数据转化成序列化的参数
        # 说白了就是把客户端传过来的数据,用序列化生成实例对象
        s = serializers.PublisherSerializer(data=request.data)
        if s.is_valid():  # 如果数据没问题
            s.save()
            return Response(s.data, status=status.HTTP_201_CREATED)
        else:
            return Response(s.errors, status=status.HTTP_400_BAD_REQUEST)
img_750b85a8d00440448a8c8e4f0298e202.png
选区_178

3.获取、更新或者删除一个(单个)出版社信息

- GET

# GET 获取出版社 
@api_view(['GET', 'PUT', 'DELETE'])
def publisher_detail(request, pk):
    try:
        # 从数据库里面找你要找的pk
        publisher = Publisher.objects.get(pk=pk)
    except Publisher.DoesNotExist:  # 如果找不到浏览器传来的pk对应的数据,返回404
        return Response(status=status.HTTP_404_NOT_FOUND)

    if request.method == 'GET':
        # 从数据库里面取出来的publisher进行序列化
        s = serializers.PublisherSerializer(publisher)
        return Response(s.data)
  • POST
 if request.method == 'PUT':
        # publisher使我们查出来的出版社信息  request.data是客户端传过来的
        s = serializers.PublisherSerializer(publisher, data=request.data)
        if s.is_valid():# 如果数据没有问题
            s.save()
            return Response(s.data)
        else:
            return Response(status=status.HTTP_204_NO_CONTENT)
img_e8d4d04eab9c204a2fc34b1e2124d9a2.png
选区_179
  • DELETE
 if request.method == 'DELETE':
        publisher.delete()
        return Response(status=status.HTTP_204_NO_CONTENT)

4. 给我们的网址添加可选的格式后缀

为了充分利用我们的响应不再与单一内容类型连接,我们可以为API路径添加对格式后缀的支持。使用格式后缀给我们明确指定了给定格式的URL,这意味着我们的API将能够处理诸如http://example.com/api/items/4.json之类的URL。

4.1 设置路由

url(r'^publishers/(?P<pk>[0-9]+)/$', views.publisher_detail)
img_9cec5c33c01b106ae10e780ef9ca0125.png
选区_180

4.2 刷新浏览器(无法访问数据,无权限)

img_6a048d2f0cb5dc1cab140bc164f59fb9.png
选区_181

4.3 创建一个账号

img_a13add1110f034afbd2fc2fa1c4927ad.png
选区_182
  • 接下来我们可以通过两种方式访问
    方式一: httpie
pip install httpie

然后在命令行访问

img_a1bbb29e2ea646cffa1f032f81cc96af.png
选区_183
img_621df2b75470f0f1c4bed03ca8196021.png
选区_184

方式二:(调出登录)

url(r'^api-auth/', include('rest_framework.urls', namespace='rest_framework'))
img_4c48c0e2e4f3820927b18048d4033196.png
选区_186
img_b66ca1e7f46575d2b47129d34eba2b5a.png
选区_185
img_ab117dcde68d64494944d58e5784acee.png
选区_187

版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

分享:
开发与运维
使用钉钉扫一扫加入圈子
+ 订阅

集结各类场景实战经验,助你开发运维畅行无忧

其他文章