drf之接口规范
web接口
# 请求工具:postman => https://www.getpostman.com/
# 接口:url链接,通过向链接发生不同的类型请求与数据得到相应的响应数据
# http://127.0.0.1:8888/test/
# https://api.map.baidu.com/place/v2/search
RESTful规范
# REST: 表征性状态转移(Representational State Transfer)
# RESTful规范:web数据请求接口设计规范
'''
1)通常使用https请求
2)域名:有api关键字出现
-- https://api.example.com (存在跨域问题)
-- https://example.com/api
3)版本:不同版本需要标注
-- https://example.com/api/v1 | -- https://example.com/api/1
-- https://example.com/api/v2 | -- https://example.com/api/2
4)资源:请求的目标数据称之为资源,资源一般都有名词复数表示
-- https://example.com/api/v1/books (之前不规范的案例: /get_books/)
5)操作方式:不从请求链接体现操作方式,从请求方式上决定操作方式
-- get:https://example.com/api/v1/books 获取所有
-- post:https://example.com/api/v1/books 新增一本
-- put:https://example.com/api/v1/book/1 更新id=1的一本
-- patch:https://example.com/api/v1/book/1 更新id=1的一本
-- delete:https://example.com/api/v1/book/1 删除id=1的一本
6)资源过滤:通过接口传递参数来过滤资源
-- https://example.com/api/v1/books?limit=10 限制10条
7)状态码:返回数据要标准状态码,通过在数据中 {"status": 200}
-- SUCCESS(0, "查询成功")
-- NODATA(1, "非正确,无数据,显示基本信息")
-- FEAILED(2, "查询失败")
8)错误信息:请求失败需要标注错误信息 {"message": "请求参数不合法"}
9)操作结果:请求操作成功的返回结果 {"results": []}
-- get:返回资源列表 | 返回单一资源
-- post:返回单一新增资源
-- put:返回更新的资源
-- patch:返回更新的资源
-- delete:返回空文档
10)子资源返回资源接口:返回的资源如果有子资源,返回子资源的链接地址,如查找书,书的封面图片就可以url表示
'''
drf简易书写TESTful规范接口
# 路由层
from app import views
urlpatterns = [
url(r'^admin/', admin.site.urls),
url(r'^cbv/', views.CBVTest.as_view()),
url(r'^books/', views.books),
url(r'^book/(?P<id>\d+)/', views.book),
]
# 视图层
from django.http import JsonResponse
book_list = [{'id': 1, 'name': '红楼梦'}, {'id': 2, 'name': '水浒传'}]
def books(request):
if request.method == "GET":
if 'ak' not in request.GET:
return JsonResponse({
'status': '101',
'msg': 'ak不存在'
}, json_dumps_params={'ensure_ascii': False})
ak = request.GET.get('ak')
if ak != '123abc':
return JsonResponse({
'status': '200',
'msg': 'ak非法'
}, json_dumps_params={'ensure_ascii': False})
return JsonResponse({
'status': '0',
'msg': 'ok',
'results': book_list
}, json_dumps_params={'ensure_ascii': False})
if request.method == 'POST':
name = request.POST.get('name')
id = len(book_list) + 1
book = {'id': id, 'name': name}
book_list.append(book)
return JsonResponse({
'status': '0',
'msg': 'ok',
'results': book
}, json_dumps_params={'ensure_ascii': False})
CBV源码分析
# 视图层
from django.shortcuts import render, HttpResponse
from django.views import View
class CBVTest(View):
# 通过调度(dispatch)分发请求
def dispatch(self, request, *args, **kwargs):
pass
super().dispatch(request, *args, **kwargs)
pass
def get(self, request):
return render(request, 'cbv.html')
def post(self, request):
return HttpResponse('cbv post method')
<!-- 模板层 -->
<form action="/cbv/" method="post">
{% csrf_token %}
<input type="text" name="usr">
<button type="submit">提交</button>
</form>
# 路由层
from app import views
urlpatterns = [
url(r'^cbv/', views.CBVTest.as_view()),
]
drf安装与使用
# 1)安装drf:pip3 install djangorestframework
# 2)settings.py注册app:INSTALLED_APPS = [..., 'rest_framework']
# 3)基于cbv完成满足RSSTful规范的接口
# 视图层
from rest_framework.views import APIView
from rest_framework.response import Response
user_list = [{'id': 1, 'name': 'Bob'}, {'id': 2, 'name': 'Tom'}]
class Users(APIView):
def get(self, request, *args, **kwargs):
return Response({
'status': 0,
'msg': 'ok',
'results': user_list
})
def post(self, request, *args, **kwargs):
# request对formdata,urlencoded,json三个格式参数均能解析
name = request.data.get('name')
id = len(user_list) + 1
user = {'id': id, 'name': name}
user_list.append(user)
return Response({
'status': '0',
'msg': 'ok',
'results': user
})
# 路由层
from app import views
urlpatterns = [
url(r'^users/', views.Users.as_view()),
]
request源码分析
# as_view()
# 核心走了父类as_view
view = super(APIView, cls).as_view(**initkwargs)
# 返回的是局部禁用csrf认证的view视图函数
return csrf_exempt(view)
# dispatch(self, request, *args, **kwargs)
# 二次封装request对象
request = self.initialize_request(request, *args, **kwargs)
# 自定义request规则
self.initial(request, *args, **kwargs)
# initialize_request(self, request, *args, **kwargs)
# 原生request封装在request._request
# initial(self, request, *args, **kwargs)
# 认证
self.perform_authentication(request)
# 权限
self.check_permissions(request)
# 频率
self.check_throttles(request)
drf之接口规范的更多相关文章
- drf 单表
^_^ # [{title,price},{}] 构造的数据结构 简单的FBV/CBV def showbooks(request): # FBV if request.method =='GET': ...
- DRF框架(一)——restful接口规范、基于规范下使用原生django接口查询和增加、原生Django CBV请求生命周期源码分析、drf请求生命周期源码分析、请求模块request、渲染模块render
DRF框架 全称:django-rest framework 知识点 1.接口:什么是接口.restful接口规范 2.CBV生命周期源码 - 基于restful规范下的CBV接口 3.请求组件 ...
- drf框架,restful接口规范,源码分析
复习 """ 1.vue如果控制html 在html中设置挂载点.导入vue.js环境.创建Vue对象与挂载点绑定 2.vue是渐进式js框架 3.vue指令 {{ }} ...
- drf框架概况-resful接口规范-请求模块-渲染模块-Postman-drf请求生命周期
drf框架 全称:django-rest- framework 知识点: """ 1.接口:什么是接口.restful接口规范 2.CBV生命周期源码-基于restful ...
- DRF 解析器组件
Django无法处理application/json协议请求的数据,即,如果用户通过application/json协议发送请求数据到达Django服务器,我们通过request.POST获取到的是一 ...
- DRF(2) - 解析器,序列化组件使用(GET/POST接口设计)
一.DRF - 解析器 1.解析器的引出 我们知道,浏览器可以向django服务器发送json格式的数据,此时,django不会帮我们进行解析,只是将发送的原数据保存在request.body中,只有 ...
- DRF之解析器组件及序列化组件
知识点复习回顾一:三元运算 三元运算能够简化我们的代码, 请看如下代码: # 定义两个变量 a = 1 b = 2 # 判断a的真假值,如果为True,则将判断表达式的前面的值赋给c,否则将判断表达 ...
- Restful 2 --DRF解析器,序列化组件使用(GET/POST接口设计)
一.DRF - 解析器 1.解析器的引出 我们知道,浏览器可以向django服务器发送json格式的数据,此时,django不会帮我们进行解析,只是将发送的原数据保存在request.body中,只有 ...
- drf 框架
一. drf简介 drf框架,全程: django-rest framework , rest是插件名字,django插件的名字叫rest,framework是框架的意思 二. 接口 在平时生活 ...
随机推荐
- Matplotlib 绘制定制的直方图
1.普通风格 代码 import numpy as np import matplotlib.pyplot as plt rng = np.random.RandomState(27) x = rng ...
- socket小程序写一个客户端,实现给服务端发送hello World字符串,将客户端发送的数据变成大写后返回
写一个客户端,实现给服务端发送hello World字符串,将客户端发送的数据变成大写后返回 本机id是192.168.xx.xy 服务端 import socket soc = socket.soc ...
- Python八大算法的实现,插入排序、希尔排序、冒泡排序、快速排序、直接选择排序、堆排序、归并排序、基数排序。
Python八大算法的实现,插入排序.希尔排序.冒泡排序.快速排序.直接选择排序.堆排序.归并排序.基数排序. 1.插入排序 描述 插入排序的基本操作就是将一个数据插入到已经排好序的有序数据中,从而得 ...
- 微信小程序,相关代码
table th:nth-of-type(1) { width: 200px; } 代码 作用 bindtap bindload 当图片载入完毕时触发,event.detail = {height, ...
- telnet安装和使用教程
一.安装telnet 1.检测telnet-server的rpm包是否安装 [root@localhost ~]# rpm -qa telnet-server若无输入内容,则表示没有安装.出于安全考虑 ...
- 完美解决该死的ie6下select总是置于最上层bug
<html> <head> <meta http-equiv="Content-Type" content="text/html; char ...
- vue文件夹上传组件选哪个好?
一. 功能性需求与非功能性需求 要求操作便利,一次选择多个文件和文件夹进行上传:支持PC端全平台操作系统,Windows,Linux,Mac 支持文件和文件夹的批量下载,断点续传.刷新页面后继续传输. ...
- 写一个function,清除字符串前后的空格(兼容所有的浏览器)
function trim1(str){ return str.replace(/(^\s*)|(\s*$)/g,""); }
- 用原生js实现,点击一个列表时,输出对应的索引
var ul = document.querySelector("ul"); ul.addEventListener("mousedown", mouseHan ...
- Redis Zrevrank 命令
Redis Zrevrank 命令返回有序集中成员的排名.其中有序集成员按分数值递减(从大到小)排序. 排名以 0 为底,也就是说, 分数值最大的成员排名为 0 . 使用 ZRANK 命令可以获得成员 ...