DRF初识
Web API接口
什么是Web API接口
我们来看下面的两个url例子:那个看起来更像是接口?
https://www.baidu.com
https://api.map.baidu.com/search
明显第二个网址看起来更像是接口。
第一个url返回网页,叫网址
第二个返回数据,叫接口
那么接口就是通过规定的请求方式访问的url链接
接口规定了提交请求参数的请求方式,访问其可以获取响应的数据
Web API 接口和一般的url链接还是有区别的,Web API接口简单概括有以下四大特点
接口四大特征
- url链接:长得像返回数据的url链接(https://api.map.baidu.com/place/v2/search)
- 请求方式:get、post、put、patch、delete
- 请求参数:请求携带的参数或者数据包(parmas or body)
- 响应数据:json或xml格式的数据
通过访问以下接口并携带参数,可以返回想要的数据:
https://api.map.baidu.com/place/v2/search?ak=hwXbwDEvhyGtKwmh6IMhRWyeOoilo7Uv®ion=上海&query=肯德基&output=json
ak:应用唯一标识码
region:搜索地区
query:搜索地点
output:返回数据的格式
{
"status":0,
"message":"ok",
"results":[
{
"name":"肯德基(罗餐厅)",
"location":{
"lat":31.415354,
"lng":121.357339
},
"address":"月罗路2380号",
"province":"上海市",
"city":"上海市",
"area":"宝山区",
"street_id":"339ed41ae1d6dc320a5cb37c",
"telephone":"(021)56761006",
"detail":1,
"uid":"339ed41ae1d6dc320a5cb37c"
}
...
]
}
接口文档的编写测试
- yapi接口文档工具(web在线接口编写工具)
- postman接口测试工具
restful接口规范
REST:英文representational state transfer直译为表现层状态转移,或者表述性状态转移;Rest是web服务的一种架构风格,一种设计风格,是一种思想;同时Rest不是针对某一种编程语言的。
以webService为例通俗解释,我们需要编写一个功能的时候以往我们都会这么写:
http://localhost:8080/admin/getUser (查询用户)
http://localhost:8080/admin/addUser (新增用户)
http://localhost:8080/admin/updateUser (更新用户)
http://localhost:8080/admin/deleteUser (删除用户)
以不同的URL(主要为使用动词)进行不同的操作。
Rest架构:**
GET http://localhost:8080/admin/user (查询用户)
POST http://localhost:8080/admin/user (新增用户)
PUT http://localhost:8080/admin/user (更新用户)
DELETE http://localhost:8080/admin/user (删除用户)
总结:URL只指定资源,以HTTP方法动词进行不同的操作。用HTTP STATUS/CODE定义操作结果。
Restful:遵守了rest风格的web服务便可称为Restful。
为什么需要Restful?
- url链接具有很强的可读性
- 规范化请求和响应
- 资源描述与视图的解耦合
- 提高交互性,方便为第三方服务提供服务
- 提供无状态的服务接口,降低复杂度,提高应用的水平扩展性。
RESTful作为目前最流行的API设计规范,一定有着它独有的魅力:强大、简洁、易上手
那么RESTful规范有哪些呢?
请往下看:
url链接设计
- 接口采用https协议,保证数据安全
- 接口使用特定关键字(api)表示
- 接口操作的数据称之为资源,体现资源名词,尽量不体现操作资源动词(如特殊的比如登录可以使用动词)
- 接口资源多版本共存使用特定关键字(v1、v2)区分版本
- 接口群操作限制条件使用?
五大请求方式
- get:获取单个或多个资源
- post:新增单个或多个资源
- put:整体修改单个或多个资源
- patch:局部修改单个或多个资源
- delete:删除单个或多个资源,不做任何资源返回
响应结果
- 应包含网络状态码 (200,201)
- 应包含数据状态码(0成功,1失败,2无数据)
- 应包含数据状态信息(对数据的描述)
- 应包含数据结果(results,常量、数组、字典),若存在图片资源则是url的请求链接
DRF框架安装
我们在了解了Web API接口和RESTful接口规范后,我们要在后端使用这个RESTful规范我们要先安装这个框架
DRF即-- django-restframework
DRF是Django的插件,所以必须确保安装了Django
pip3 install djangorestframework
使用DRF时,要在settings中注册
INSTALLED_APPS = (
...
'rest_framework',
)
基于原生Django实现十大接口
我们已经知道了五大请求方式,基于五大请求方式,我们可以对请求进行 单|群 操作
api/urls.py
from django.conf.urls import url
from . import views
urlpatterns = [
url(r'^books/$', views.BookView.as_view()),
url(r'^books/(?P<pk>\d+)/$', views.BookView.as_view())
]
api/models.py
from django.db import models
class Book(models.Model):
name = models.CharField(max_length=64)
price = models.DecimalField(max_digits=5, decimal_places=2)
api/views.py
from django.http import JsonResponse
from django.views import View
# 一个视图类可以保护常规五个请求方法:get|post|put|patch|delete
# 五个请求方法处理十个资源操作的逻辑:单群查|单群增|单群整体改|单群局部改|单群删
from . import models
class BookView(View):
def _single_get(self, pk):
book_dic = models.Book.objects.filter(pk=pk).values('name', 'price').first()
if not book_dic:
return JsonResponse({
'status': 1,
'msg': '单查 资源不存在',
})
return JsonResponse({
'status': 0,
'msg': '单查 ok',
'results': book_dic
})
def _many_get(self):
book_query = models.Book.objects.values('name', 'price')
book_list = list(book_query)
return JsonResponse({
'status': 0,
'msg': '群查 ok',
'results': book_list
})
def get(self, request, *args, **kwargs):
pk = kwargs.get('pk')
if pk: # 单查
return self._single_get(pk)
else: # 群查
return self._many_get()
def post(self, request, *args, **kwargs):
return JsonResponse({
'status': 0,
'msg': 'post ok'
})
def put(self, request, *args, **kwargs):
return JsonResponse({
'status': 0,
'msg': 'put ok'
})
def patch(self, request, *args, **kwargs):
return JsonResponse({
'status': 0,
'msg': 'patch ok'
})
def delete(self, request, *args, **kwargs):
return JsonResponse({
'status': 0,
'msg': 'delete ok'
})
Django CBV源码分析
DRF初识的更多相关文章
- DRF初识与序列化
一.Django的序列化方法 1.为什么要用序列化组件 做前后端分离的项目,我们前后端数据交互一般都选择JSON,JSON是一个轻量级的数据交互格式.那么我们给前端数据的时候都要转成json格式,那就 ...
- Django框架深入了解_01(Django请求生命周期、开发模式、cbv源码分析、restful规范、跨域、drf的安装及源码初识)
一.Django请求生命周期: 前端发出请求到后端,通过Django处理.响应返回给前端相关结果的过程 先进入实现了wsgi协议的web服务器--->进入django中间件--->路由f分 ...
- day81 初识drf
目录 一.web应用模式 二.API接口 1 rpc(远程过程调用/远程服务调用) 2 restful(资源状态转换) 三.RESTful API规范 四.序列化 五.Django Rest_Fram ...
- DRF 视图初识
from django.shortcuts import render from rest_framework.generics import ListAPIView,CreateAPIView,Up ...
- python 全栈开发,Day99(作业讲解,DRF版本,DRF分页,DRF序列化进阶)
昨日内容回顾 1. 为什么要做前后端分离? - 前后端交给不同的人来编写,职责划分明确. - API (IOS,安卓,PC,微信小程序...) - vue.js等框架编写前端时,会比之前写jQuery ...
- DRF的认证,频率,权限
1,DRF的认证 初识认证:浏览器是无状态的,一次导致每次发的请求都是新的请求,所以每次请求,服务器都会进行校验,这样就很繁琐,这趟我们就需要给每一个用户登录后一个新的标识,浏览器每次都会带着这个唯一 ...
- drf
跨域同源 django做跨域同源 需要把csrf去掉 跨站请求伪造 同源 同源机制:域名.协议.端口号相同的同源 简单请求 不写头部请求 跨域会拦截报错缺少请求信息 (1) 请求方法是以下三种方法之一 ...
- drf源码系列
过滤器 对查询出来的数据进行筛选可写可不写 from rest_framework.filters import BaseFilterBackend 源码 ''' def filter_queryse ...
- drf框架 - JWT认证插件
JWT认证 JWT认证方式与其他认证方式对比: 优点 1) 服务器不要存储token,token交给每一个客户端自己存储,服务器压力小 2)服务器存储的是 签发和校验token 两段算法,签发认证的效 ...
随机推荐
- linux就该这么学--资料整理--持续更新
基础命令 服务管理 systemctl redhat7 systemctl start foo.service 启动服务 systemctl restart foo.service 重启服务 syst ...
- eclipse新建maven项目和聚合项目
1.new maven project : next 2.勾选 create a simple project : next 3.Group Id:项目的包路径 如com.jiayou.zjl, ...
- 7_API调用
0 查看 kifastcallentry 里面具体怎么调用 首先是 切换了 fs 为kpcr的选择子 然后 构造了 一个trap frame(保存3环-->0环 切换的上下文:如果0环不使用就没 ...
- overleaf 提交arXiv 不成功
从overleaf下载的PDF不能够直接提交给arXiv,但是可以在submit中选择导出下载压缩包,图片不能是png,最好是PDF 或者eps. 参考文献是bbl 文件,不是bib.
- bzoj 3579: 破冰派对
题意: 给你一个图,问你有多少个方案把他分成连个新的图.使得一个图是一个团,另外一个是独立集 一些闲话: 以前做过一次这个题..当时听说爆搜可以过,就无脑莽过去了.. 也没有思考为什么爆搜能过,或者有 ...
- c# 使用Expression 生成sql
使用Expression 生成sql update语句的时候遇到了个问题 ,Expression<Action<T>> la 这个委托里面老获取不到 引用类型的值,甚至 ...
- Sublime Text自定制代码片段(Code Snippets)
在编写代码的整个过程中,开发人员经常会一次又一次的改写或者重用相同的代码段,消除这种重复过程的方法之一是把我们经常用到的代码保存成代码片段(snippets),这使得我们可以方便的检索和使用它们. 为 ...
- Batch - C:\Progra~1是什么意思
就是那种DOS下的8.3的规范,可以这样写 C:\Progra~1也可以这样写全名字的 "C:\Program File",因为这个路径中的文件夹名有空格,要用两个英文输入法下的双 ...
- [JZOJ3347] 【NOI2013模拟】树的难题
题目 题目大意 给你一棵树,每个节点有三种黑.白.灰三种颜色. 你要割掉一些边(每条边被割需要付出一定的代价),使得森林的每棵树满足: 没有黑点或至多一个白点. 思考历程 这题一看就知道是一个树形DP ...
- 模拟求root——cf1067B
注意最后一轮要单独求一下 且最后只能有一个root #include <bits/stdc++.h> using namespace std; #define MOD 1000000007 ...