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

简介: 一、请求和响应1. 请求对象(Request objects)拓展了Django自带的HttpRequestREST框架引入了一个扩展了常规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
目录
相关文章
|
4月前
|
Python API 网络架构
Django实践-10RESTful架构和DRF入门
Django实践-10RESTful架构和DRF入门
Django实践-10RESTful架构和DRF入门
|
4月前
|
中间件 程序员 开发工具
Django实践-08中间件的应用
Django实践-08中间件的应用
Django实践-08中间件的应用
|
4天前
|
测试技术 持续交付 Docker
Django中的自动化部署与持续集成实践
【4月更文挑战第15天】本文介绍了Django项目中自动化部署与持续集成的实践方法。自动化部署通过选择Ansible、Fabric或Docker等工具,编写部署脚本,配置持续集成工具(如Jenkins、GitLab CI),确保服务器环境一致,实现快速应用上线。持续集成则涉及配置版本控制系统,设置自动化构建和测试,编写全面的测试用例,集成代码质量检查工具,并配置通知机制,以提升代码质量和开发效率。这两者结合能有效提升项目的迭代速度和可靠性。
|
2月前
|
数据库 开发者 Python
Python在Web开发中的应用:Flask与Django框架介绍与实践
Python在Web开发中的应用:Flask与Django框架介绍与实践
|
4月前
|
前端开发 Python JSON
Django实践-09前后端分离开发入门
Django实践-09前后端分离开发入门
Django实践-09前后端分离开发入门
|
4月前
|
SQL Python BI
Django实践-07日志调试,Django-Debug-Toolbar配置与sql优化
Django实践-07日志调试,Django-Debug-Toolbar配置与sql优化
Django实践-07日志调试,Django-Debug-Toolbar配置与sql优化
|
4月前
|
前端开发 开发工具 git
Django实践-06导出excel/pdf/echarts
Django实践-06导出excel/pdf/echarts
Django实践-06导出excel/pdf/echarts
|
4月前
|
中间件 开发工具 数据安全/隐私保护
Django实践-05Cookie和Session
Django实践-05Cookie和Session
Django实践-05Cookie和Session
|
4月前
|
JSON 前端开发 JavaScript
Django实践-04静态资源和Ajax请求
Django实践-04静态资源和Ajax请求
Django实践-04静态资源和Ajax请求
|
4月前
|
人工智能 开发工具 数据库
Django实践-03模型-02基于admin管理表
Django实践-03模型-02基于admin管理表
Django实践-03模型-02基于admin管理表