原文链接:https://www.sxzhongrui.com/maple-shaw/p/7865767.html
1。什么是RESTful
- REST 与技术无关。它代表了一种软件架构风格。 REST 是表述性状态传输的缩写。中文翻译是“代表性状态转移”
- REST从资源的角度看待整个网络。它通过URL来标识分布在网络中某个节点的资源。客户端应用程序通过 URL 获取资源的表示。获取这些表示会导致这些应用程序更改状态
- 所有的数据,无论是通过网络获取的,还是操作(增、删、改、查)的,都是资源。将所有数据视为资源,是 REST 区别于其他架构风格最本质的属性
- 针对REST面向资源的架构风格,有人提出了一个新的结构概念,即:面向资源的架构(ROA:Resource Oriented Architecture)
2. RESTful API 设计
- API与用户之间的通信协议始终使用HTTPs协议。
- 域名
-
?
- https://www.sxzhongrui.com/api/ API非常简单
- 版本
- URL,例如:https://www.sxzhongrui.com/v1/ ?
- 路径,网络上的一切都被视为资源,并以名词的形式表达(可以是复数)
- https://www.sxzhongrui.com/v1/zoos
- https://www.sxzhongrui.com/v1/animals
- https://www.sxzhongrui.com/v1/employees
- 方法
- GET:从服务器检索资源(一项或多项)
- POST:在服务器上创建新资源
- PUT :更新服务器上的资源(客户端提供完整更改的资源)
- PATCH:更新服务器上的资源(客户端提供更改的属性)
- DELETE:从服务器删除资源
- 过滤,以url中上传参数的形式传递搜索条件
- https://www.sxzhongrui.com/v1/zoos?limit=10:指定返回记录数
- https://www.sxzhongrui.com/v1/zoos?offset=10:指定返回记录的起始位置
- https://www.sxzhongrui.com/v1/zoos?page=2&per_page=100:指定第几页以及每页记录数
- https://www.sxzhongrui.com/v1/zoos?sortby=name&order=asc:指定返回结果按照哪个属性排序,以及排序顺序
- https://www.sxzhongrui.com/v1/zoos?animal_type_id=1:指定过滤条件
- 状态代码
- 错误处理,当状态码为4xx时,应返回错误信息,以error为key。
123{
错误:
“API 密钥无效”
}
- 返回结果。对于不同的操作,服务器返回给用户的结果应符合以下规范。
123456GET
/
集合:返回资源对象的列表(数组)
GET
/
集合
/
资源:返回单个资源对象
POST
/
集合:返回新生成的资源对象
PUT
/
集合
/
资源:返回完整的资源对象
PATCH
/
集合
/
资源:返回完整的资源对象
删除
/
集合
/
资源:返回空文档
- Hypermedia API,RESTful API最好是Hypermedia,即在返回结果中提供其他API方法的链接,这样用户不用查看文档就知道下一步该做什么。
123456{
“链接”
:{
“rel”
:
“集合 https://www.sxzhongrui.com/zoos”
,
“href”
:
“https://www.sxzhongrui.com/zoos”
,
“标题”
:
“动物园列表”
,
“类型”
:
“application/vnd.yourformat+json”
}}
摘自:http://www.sxzhongrui.com/blog/2014/05/restful_api.html
返回顶部3.基于Django
路由系统:
123urlpatterns
=
[
url(r
'^用户'
,www.sxzhongrui.com_view()),
]
CBV 视图:
1234567891011121314151617来自
django.views
导入
查看
来自
django.http
导入
JsonResponse
班级
用户(查看):
def
获取(
自我
,请求,
*
args,
*
*
kwargs):
结果
=
{
'状态'
:
正确
,
'数据'
:
'响应数据'
}
返回
JsonResponse(结果,状态
=
200
)
def
帖子(
自我
,请求,
*
args,
*
*
kwargs):
结果
=
{
'状态'
:
True
,
'数据'
:
'响应数据'
}
返回
JsonResponse(结果,状态
=
200
)
回到顶部四。基于Django Rest Framework框架实现
1。基本流程
www.sxzhongrui.com
123456来自
django.conf.urls
导入
url,包括
来自
web.views.s1_api
导入
TestView
urlpatterns
=
[
url(r
'^test/'
, www.sxzhongrui.com_view()),
]
www.sxzhongrui.com
123456789101112131415161718192021来自
rest_framework.views
导入
APIView
来自
rest_framework.response
导入
响应
类
测试视图(APIView):
def
调度(
自我
,请求,
*
args,
*
*
kwargs):
"""
请求到来之后,都要执行调度方法,调度方法根据请求方式不同触发get/post/put等方法
注:APIView中的dispatch方法有很多很多功能
"""
返回
超级
().dispatch(请求,
*
args, *
*
kwargs)
def
get(
self
,请求,
*
arg s,
*
*
kwargs):
返回
响应(
'GET请求,响应内容'
)
def
帖子(
自我
,请求,
*
arg s,
*
*
kwargs):
返回
响应(
'POST请求,响应内容'
)
def
put(
self
,请求,
*
arg s,
*
*
kwargs):
返回
响应(
'PUT请求,响应内容'
)
以上就是restframework框架的基本流程。重要的函数是在APIView的dispatch中触发的。
2。身份验证和授权
a。用户url传入的token认证
from django.conf.urls import url, include 从 web.viewsimport TestView url 模式 = [ url(r'^test/', www.sxzhongrui.com_view()), 】
b。请求头认证
from django.conf.urls import url, include 从 web.viewsimport TestView url 模式 = [ url(r'^test/', www.sxzhongrui.com_view()), 】
c. 多种认证规则
from django.conf.urls import url, include 从 web.views.s2_auth 导入 TestView url 模式 = [ url(r'^test/', www.sxzhongrui.com_view()), 】
d.身份验证和权限
from django.conf.urls import url, include from web.views import TestView urlpatterns = [ url(r'^test/', www.sxzhongrui.com_view()), ]
e. 全局使用
上述操作中均是对单独视图进行特殊配置,如果想要对全局进行配置,则需要再配置文件中写入即可。
from django.conf.urls import url, include from web.views import TestView urlpatterns = [ url(r'^test/', www.sxzhongrui.com_view()), ]
3. 用户访问次数/频率限制
a. 基于用户IP限制访问频率
from django.conf.urls import url, include from web.views import TestView urlpatterns = [ url(r'^test/', www.sxzhongrui.com_view()), ]
b. 基于用户IP显示访问频率(利于Django缓存)
REST_FRAMEWORK = { 'DEFAULT_THROTTLE_RATES': { 'test_scope': '10/m', }, }
from django.conf.urls import url, include from web.views import TestView urlpatterns = [ url(r'^test/', www.sxzhongrui.com_view()), ]
c. view中限制请求频率
REST_FRAMEWORK = { 'DEFAULT_THROTTLE_RATES': { 'xxxxxx': '10/m', }, }
from django.conf.urls import url, include from web.views import TestView urlpatterns = [ url(r'^test/', www.sxzhongrui.com_view()), ]
d. 匿名时用IP限制+登录时用Token限制
from django.conf.urls import url, include from web.views.s3_throttling import TestView urlpatterns = [ url(r'^test/', www.sxzhongrui.com_view()), ]
e. 全局使用
4. 版本
a. 基于url的get传参方式
如:/users?version=v1
REST_FRAMEWORK = { 'DEFAULT_VERSION': 'v1', # 默认版本 'ALLOWED_VERSIONS': ['v1', 'v2'], # 允许的版本 'VERSION_PARAM': 'version' # URL中获取值的key }
from django.conf.urls import url, include from web.views import TestView urlpatterns = [ url(r'^test/', www.sxzhongrui.com_view(),name='test'), ]
b. 基于url的正则方式
如:/v1/users/
REST_FRAMEWORK = { 'DEFAULT_VERSION': 'v1', # 默认版本 'ALLOWED_VERSIONS': ['v1', 'v2'], # 允许的版本 'VERSION_PARAM': 'version' # URL中获取值的key }
from django.conf.urls import url, include from web.views import TestView urlpatterns = [ url(r'^(?P
[v1|v2]+)/test/', www.sxzhongrui.com_view(), name='test'), ] c. 基于 accept 请求头方式
如:Accept: application/json; version=1.0
REST_FRAMEWORK = { 'DEFAULT_VERSION': 'v1', # 默认版本 'ALLOWED_VERSIONS': ['v1', 'v2'], # 允许的版本 'VERSION_PARAM': 'version' # URL中获取值的key }
from django.conf.urls import url, include from web.views import TestView urlpatterns = [ url(r'^test/', www.sxzhongrui.com_view(), name='test'), ]
d. 基于主机名方法
如:www.sxzhongrui.com
ALLOWED_HOSTS = ['*'] REST_FRAMEWORK = { 'DEFAULT_VERSION': 'v1', # 默认版本 'ALLOWED_VERSIONS': ['v1', 'v2'], # 允许的版本 'VERSION_PARAM': 'version' # URL中获取值的key }
from django.conf.urls import url, include from web.views import TestView urlpatterns = [ url(r'^test/', www.sxzhongrui.com_view(), name='test'), ]
e. 基于django路由系统的namespace
如:www.sxzhongrui.com/v1/users/
REST_FRAMEWORK = { 'DEFAULT_VERSION': 'v1', # 默认版本 'ALLOWED_VERSIONS': ['v1', 'v2'], # 允许的版本 'VERSION_PARAM': 'version' # URL中获取值的key }
f. 全局使用
REST_FRAMEWORK = { 'DEFAULT_VERSIONING_CLASS':"rest_framework.versioning.URLPathVersioning", 'DEFAULT_VERSION': 'v1', 'ALLOWED_VERSIONS': ['v1', 'v2'], 'VERSION_PARAM': 'version' }
5. 解析器(parser)
根据请求头 content-type 选择对应的解析器就请求体内容进行处理。
a. 仅处理请求头content-type为application/json的请求体
from django.conf.urls import url, include from web.views.s5_parser import TestView urlpatterns = [ url(r'test/', www.sxzhongrui.com_view(), name='test'), ]
b. 仅处理请求头content-type为application/x-www-form-urlencoded 的请求体
from django.conf.urls import url, include from web.views import TestView urlpatterns = [ url(r'test/', www.sxzhongrui.com_view(), name='test'), ]
c. 仅处理请求头content-type为multipart/form-data的请求体
from django.conf.urls import url, include from web.views import TestView urlpatterns = [ url(r'test/', www.sxzhongrui.com_view(), name='test'), ]
d. 仅上传文件
from django.conf.urls import url, include from web.views import TestView urlpatterns = [ url(r'test/(?P
[^/]+)', www.sxzhongrui.com_view(), name='test'), ] e. 同时多个Parser
当同时使用多个parser时,rest framework会根据请求头content-type自动进行比对,并使用对应parser
from django.conf.urls import url, include from web.views import TestView urlpatterns = [ url(r'test/', www.sxzhongrui.com_view(), name='test'), ]
f. 全局使用
from django.conf.urls import url, include from web.views import TestView urlpatterns = [ url(r'test/', www.sxzhongrui.com_view(), name='test'), ]
注意:个别特殊的值可以通过Django的request对象 request._request 来进行获取
6. 序列化
序列化用于对用户请求数据进行验证和数据进行序列化。
a. 自定义字段
from django.conf.urls import url, include from web.views.s6_serializers import TestView urlpatterns = [ url(r'test/', www.sxzhongrui.com_view(), name='test'), ]
b. 基于Model自动生成字段
from django.conf.urls import url, include from web.views.s6_serializers import TestView urlpatterns = [ url(r'test/', www.sxzhongrui.com_view(), name='test'), ]
c. 生成URL
7. 分页
a. 根据页码进行分页
b. 位置和个数进行分页
from django.conf.urls import url, include from web.views import s9_pagination urlpatterns = [ url(r'^test/', s9_www.sxzhongrui.com_view()), ]
c. 游标分页
from django.conf.urls import url, include from web.views import s9_pagination urlpatterns = [ url(r'^test/', s9_www.sxzhongrui.com_view()), ]
8. 路由系统
a. 自定义路由
b. 半自动路由
c. 全自动路由
9. 视图
a. GenericViewSet
b. ModelViewSet(自定义URL)
c. ModelViewSet(rest framework路由)
10. 渲染器
根据 用户请求URL 或 用户可接受的类型,筛选出合适的 渲染组件。
用户请求URL:- http://127.0.0.1:8000/test/?format=json
- http://127.0.0.1:8000/test.json
用户请求头:
- Accept:text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8
a. json
访问URL:
- http://127.0.0.1:8000/test/?format=json
- http://127.0.0.1:8000/test.json
- http://127.0.0.1:8000/test/
b. 表格
访问URL:
- http://127.0.0.1:8000/test/?format=admin
- http://127.0.0.1:8000/test.admin
- http://127.0.0.1:8000/test/
c. Form表单
访问URL:
- http://127.0.0.1:8000/test/?format=form
- http://127.0.0.1:8000/test.form
- http://127.0.0.1:8000/test/
d. 自定义显示模板
访问URL:
- http://127.0.0.1:8000/test/?format=html
- http://127.0.0.1:8000/test.html
- http://127.0.0.1:8000/test/
e. 浏览器格式API+JSON
访问URL:
- http://127.0.0.1:8000/test/?format=api
- http://127.0.0.1:8000/test.api
- http://127.0.0.1:8000/test/
注意:如果同时多个存在时,自动根据URL后缀来选择渲染器。
- 错误处理,当状态码为4xx时,应返回错误信息,以error为key。