DRF初识攻坚(一)-----框架初识

一、restful

1.1 前后端开发模式

  • 前后端分离在这里插入图片描述
  • 前后端不分离 在这里插入图片描述

1.2 restful简析

  • 定义:用于不同软件/程序网络(例如互联网)中互相传递信息软件构建风格,非强制性

  • 特点:

    • 操作主体:以request的method来决定操作动作,以路由来决定操作对象
    • 交互媒介:前后端间以json格式传递数据
    • 路由:只可使用名词
    request.method路由释义
    POST/zoo一个动物
    DELETE/zoo/ID除具体单个动物所有信息(ID为查询项)
    PUT/zoo/ID具体单个动物所有信息(ID为查询项)
    PATCH/zoo/ID具体单个动物部分信息(ID为查询项)
    GET/zoo询所有动物的所有信息
    GET/zoo/ID询具体单个动物信息(ID为查询项)

    示例域名:https://www.doubi.com/api/1.0/zoo,api为全部前后端分离项目起始路由,1.0为版本号,/zoo为DRF路由

  • DRF

    • 定义:全称Django rest framework,由Django实现的restful规范,实际上是一个Django的APP
    • 优化部分:相对Django,主要封装路由视图序列器、其他(权限、装饰器、分页)

1.3 JSON数据简析

  • 键值对:键必须为字符串(带双引号),值根据数据类型如下
  • 常规写法
    # 这是字符串
    { "name":"张三" }							
    # 这是整型、也可浮点型
    { "age":30 }							
    # 这是布尔类型
    { "log_in":true }						
    # 这是空
    { "married":null }						
    # 这是数组
    { "detail": [ "张三", 30, true, null ]}	
    

    注:以上每行都是一个jsont对象

  • 对象写法
    # json对象复合写法:大括号内看做为一个json对象
    {						
    	"name":"张三", 
    	"age":30, 
    	"log_in":true, 
    	"married":null
    }	
    # json对象数组:中括号内为多个json对象
    [						
    	{					
    		"name":"张三", 
    		"age":30, 
    		"log_in":true, 
    		"married":null
    	},
    	{					
    	"name":"张三", 
    	"age":30, 
    	"log_in":true, 
    	"married":null
    	}		
    ]
    
  • 调用转换:根据语言不同均有相应转换

二、安装使用

2.1 操作步骤

  • 安装:pip install djangorestframework
  • 注册APP:在Django项目里的setting.py文件中INSTALLED_APPS = []中新增'rest_framework',
  • 常规路由urls.py
    from django.urls import path
    from api import views
    
    urlpatterns = [
        path('info/', views.InfoView.as_view())
    ]
    

  • 常规数据库
    from django.db import models
    
    class Info(models.Model):
        name = models.CharField(max_length=24)
    
    手动填充数据
    在这里插入图片描述
  • 视图函数/api/views.py
    from rest_framework.views import APIView
    from rest_framework.response import Response
    
    
    class InfoView(APIView):							
        # DRF的APIView视图,继承了View类
        # APIView中可用request.query_params获得get的请求体
        # APIView中可用request.data获得非get的请求体
        def get(self, request, *args, **kwargs):		# get请求
            data = [									# 字典式列表
                {'id': 1, 'title': "这是标题一"},
                {'id': 2, 'title': "这是标题二"},
                {'id': 3, 'title': "这是标题三"},
                {'id': 4, 'title': "这是标题四"},
            ]
            # 封装了JsonResponse:将字典式列表转换成json返回前端
            return Response(data, )						
            
        def post(self, request, *args, **kwargs):		# post请求	
        	# 获得请求体方法一:request.data,应用于DRF中
        	# 获得请求题方法二:request.body, 常规获得请求体					
            print(request.data)									
            # values函数返回字典型列表的queryset
            model_data = models.Info.objects.all().values("id", "name")
            # list去掉model_data的queryset外壳,做强制类型转换
        	return Response(list(model_data))					
    
  • Response语句
    • 写法return Response("这是返回数据", status = status.HTTP_404_NOT_FOUND)
    • 导入:from rest_framework import status
    • 状态码:status示意如下
      • 2xx状态码:表明客户端的请求已被成功接收,理解和接受
        HTTP_200_OK
        HTTP_201_CREATED
        HTTP_202_ACCEPTED
        HTTP_203_NON_AUTHORITATIVE_INFORMATION
        HTTP_204_NO_CONTENT
        HTTP_205_RESET_CONTENT
        HTTP_206_PARTIAL_CONTENT
        HTTP_207_MULTI_STATUS
        
      • 3xx状态码:状态码表明用户代理需要采取进一步行动来完成请求
        HTTP_300_MULTIPLE_CHOICES
        HTTP_301_MOVED_PERMANENTLY
        HTTP_302_FOUND
        HTTP_303_SEE_OTHER
        HTTP_304_NOT_MODIFIED
        HTTP_305_USE_PROXY
        HTTP_306_RESERVED
        HTTP_307_TEMPORARY_REDIRECT
        
      • 4xx 状态码:适用于客户端出现错误的情况。除了响应 HEAD 请求之外,服务器应该包含一个错误情况说明的实体,以及它是临时的还是永久的
        HTTP_400_BAD_REQUEST
        HTTP_401_UNAUTHORIZED
        HTTP_402_PAYMENT_REQUIRED
        HTTP_403_FORBIDDEN
        HTTP_404_NOT_FOUND
        HTTP_405_METHOD_NOT_ALLOWED
        HTTP_406_NOT_ACCEPTABLE
        HTTP_407_PROXY_AUTHENTICATION_REQUIRED
        HTTP_408_REQUEST_TIMEOUT
        HTTP_409_CONFLICT
        HTTP_410_GONE
        HTTP_411_LENGTH_REQUIRED
        HTTP_412_PRECONDITION_FAILED
        HTTP_413_REQUEST_ENTITY_TOO_LARGE
        HTTP_414_REQUEST_URI_TOO_LONG
        HTTP_415_UNSUPPORTED_MEDIA_TYPE
        HTTP_416_REQUESTED_RANGE_NOT_SATISFIABLE
        HTTP_417_EXPECTATION_FAILED
        HTTP_422_UNPROCESSABLE_ENTITY
        HTTP_423_LOCKED
        HTTP_424_FAILED_DEPENDENCY
        HTTP_428_PRECONDITION_REQUIRED
        HTTP_429_TOO_MANY_REQUESTS
        HTTP_431_REQUEST_HEADER_FIELDS_TOO_LARGE
        HTTP_451_UNAVAILABLE_FOR_LEGAL_REASONS
        
      • 5xx 状态码:表示服务器意识到其发生错误或无法执行请求的情况。除了响应 HEAD 请求之外,服务器应该包含一个错误情况说明的实体,以及它是临时的还是永久的
        HTTP_500_INTERNAL_SERVER_ERROR
        HTTP_501_NOT_IMPLEMENTED
        HTTP_502_BAD_GATEWAY
        HTTP_503_SERVICE_UNAVAILABLE
        HTTP_504_GATEWAY_TIMEOUT
        HTTP_505_HTTP_VERSION_NOT_SUPPORTED
        HTTP_507_INSUFFICIENT_STORAGE
        HTTP_511_NETWORK_AUTHENTICATION_REQUIRED
        
      • 帮助函数:以下帮助函数可用于识别响应代码的类别
        is_informational()  # 1xx
        is_success()        # 2xx
        is_redirect()       # 3xx
        is_client_error()   # 4xx
        is_server_error()   # 5xx
        

2.2 显示

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值