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
目录
相关文章
|
1月前
|
存储 缓存 NoSQL
深入理解Django与Redis的集成实践
深入理解Django与Redis的集成实践
60 0
|
3月前
|
存储 监控 数据库
Django 后端架构开发:高效日志规范与实践
Django 后端架构开发:高效日志规范与实践
73 1
|
6月前
|
Python API 网络架构
Django实践-10RESTful架构和DRF入门
Django实践-10RESTful架构和DRF入门
Django实践-10RESTful架构和DRF入门
|
1月前
|
前端开发 JavaScript UED
探索Python Django中的WebSocket集成:为前后端分离应用添加实时通信功能
通过在Django项目中集成Channels和WebSocket,我们能够为前后端分离的应用添加实时通信功能,实现诸如在线聊天、实时数据更新等交互式场景。这不仅增强了应用的功能性,也提升了用户体验。随着实时Web应用的日益普及,掌握Django Channels和WebSocket的集成将为开发者开启新的可能性,推动Web应用的发展迈向更高层次的实时性和交互性。
78 1
|
3月前
|
负载均衡 应用服务中间件 网络安全
Django后端架构开发:Nginx服务优化实践
Django后端架构开发:Nginx服务优化实践
61 2
|
3月前
|
JSON API 数据安全/隐私保护
Django 后端架构开发:JWT 项目实践与Drf版本控制
Django 后端架构开发:JWT 项目实践与Drf版本控制
76 0
|
4月前
|
前端开发 JavaScript API
探索Python Django中的WebSocket集成:为前后端分离应用添加实时通信功能
【7月更文挑战第17天】现代Web开发趋势中,前后端分离配合WebSocket满足实时通信需求。Django Channels扩展了Django,支持WebSocket连接和异步功能。通过安装Channels、配置设置、定义路由和消费者,能在Django中实现WebSocket交互。前端使用WebSocket API连接后端,实现双向数据流,如在线聊天功能。集成Channels提升Web应用的实时性和用户体验,适应实时交互场景的需求。**
196 6
|
4月前
|
安全 API 网络安全
Django RESTful API安全实践
【7月更文挑战第19天】构建安全的Django RESTful API需要综合考虑多个方面,包括身份验证与授权、数据验证与清洗、安全的HTTPS连接、限制请求频率以及审计与日志记录等。通过实施这些安全实践,可以有效地保护API服务免受各种安全威胁的侵害,确保用户数据的安全性和服务的可用性。开发者在开发RESTful API时,应始终将安全性放在首位,确保API服务的安全可靠。
|
5月前
|
存储 监控 调度
Django中的定时任务与后台任务队列的实践
【6月更文挑战第10天】在Django中实现定时任务和后台任务队列,可以使用Celery+Beat进行定时任务,Django Q处理后台任务。Celery配置包括设置Broker和Result Backend,创建Celery实例及任务。Django Q则涉及安装、配置ORM和创建任务。通过`async_task`将任务放入队列。注意性能、资源、安全和错误处理。使用时需考虑认证、输入验证、日志监控、部署策略和测试质量保障。
66 3
Django中的定时任务与后台任务队列的实践
|
5月前
|
安全 API 数据安全/隐私保护
Django REST framework安全实践:轻松实现认证、权限与限流功能
Django REST framework安全实践:轻松实现认证、权限与限流功能