一、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
- 2xx状态码:表明客户端的请求已被成功接收,理解和接受
- 写法
2.2 显示
- get请求
- post请求
postman请求填写格式
pycharm命令行显示
跳转至总篇目录