一、Django rest framework框架安装:
pip3 install djangorestframework -i http://pypi.douban.com/simple/ --trusted-host=pypi.douban.com
二、Restful framework
是一个框架,主要实现前后端分离,提供接口API, 对API做一些规范,中文名: 表征状态转移
三、 RESTful API设计规范
- URL
https://example.org/api/ API很简单
https://api.example.com 尽量将API部署在专用域名(会存在跨域问题)。跨域时,引发发送多次请求
解决跨域问题:
1.header("Access-Control-Allow-Origin:http://www.xxx.com") //这里即指定http://www.xxx.com 这个域可以请求它;
2.header("Access-Control-Allow-Origin:*") //这里即所有域都可以请求它;
- url名词
https://api.example.com/v1/zoos
因为是资源,最好起一个英文名词 zooms、animals、employees等
- 版本
https://api.example.com/v1/zoos?limit=10
如果有版本最好可以显示在url
v1 可以代表第一版
- 提交方式
GET :从服务器取出资源(一项或多项)
POST :在服务器新建一个资源
PUT :在服务器更新资源(客户端提供改变后的完整资源)
PATCH :在服务器更新资源(客户端提供改变的属性)
DELETE :从服务器删除资源
- status
状态码
200 OK - [GET]:服务器成功返回用户请求的数据,该操作是幂等的(Idempotent)。
201 CREATED - [POST/PUT/PATCH]:用户新建或修改数据成功。
202 Accepted - [*]:表示一个请求已经进入后台排队(异步任务)
204 NO CONTENT - [DELETE]:用户删除数据成功。
400 INVALID REQUEST - [POST/PUT/PATCH]:用户发出的请求有错误,服务器没有进行新建或修改数据的操作,该操作是幂等的。
401 Unauthorized - [*]:表示用户没有权限(令牌、用户名、密码错误)。
403 Forbidden - [*] 表示用户得到授权(与401错误相对),但是访问是被禁止的。
404 NOT FOUND - [*]:用户发出的请求针对的是不存在的记录,服务器没有进行操作,该操作是幂等的。
406 Not Acceptable - [GET]:用户请求的格式不可得(比如用户请求JSON格式,但是只有XML格式)。
410 Gone -[GET]:用户请求的资源被永久删除,且不会再得到的。
422 Unprocesable entity - [POST/PUT/PATCH] 当创建一个对象时,发生一个验证错误。
500 INTERNAL SERVER ERROR - [*]:服务器发生错误,用户将无法判断发出的请求是否成功。
更多详细:http://www.w3.org/Protocols/rfc2616/rfc2616-sec10.html
- 错误详细
错误处理,状态码是4xx时,应返回错误信息,error当做key。
例如:
{
error: "Invalid API key",
}
- Hypermedia link
Hypermedia API,RESTful API最好做到Hypermedia,即返回结果中提供链接,
连向其他API方法,使得用户不查文档,也知道下一步应该做什么。
例如:
{"link": {
"rel": "collection https://www.example.com/zoos",
"href": "https://api.example.com/zoos",
"title": "List of zoos",
"type": "application/vnd.yourformat+json"
}}
四、基本流程
Django生命周期:
前端发送请求-->Django的wsgi-->中间件-->路由系统-->视图-->ORM数据库操作-->模板-->返回数据给用户
rest framework生命周期:
前端发送请求-->Django的wsgi-->中间件-->路由系统_执行CBV的as_view(),就是执行内部的dispath方法-->在执行dispath之前,有版本分析 和 渲染器-->在dispath内,对request封装-->版本-->认证-->权限-->限流-->视图-->如果视图用到缓存( request.data or request.query_params )就用到了 解析器-->视图处理数据,用到了序列化(对数据进行序列化或验证) -->视图返回数据可以用到分页
in url.py
from django.conf.urls import url, include
from web.views.s1_api import TestView
urlpatterns = [
url(r'^test/', TestView.as_view()),
]
in views.py
from rest_framework.views import APIView
from rest_framework.response import Response
class TestView(APIView):
def dispatch(self, request, *args, **kwargs):
"""
请求到来之后,都要执行dispatch方法,dispatch方法根据请求方式不同触发 get/post/put等方法
注意:APIView中的dispatch方法有好多好多的功能
"""
return super().dispatch(request, *args, **kwargs)
def get(self, request, *args, **kwargs):
return Response('GET请求,响应内容')
def post(self, request, *args, **kwargs):
return Response('POST请求,响应内容')
def put(self, request, *args, **kwargs):
return Response('PUT请求,响应内容')
def options(self, request, *args, **kwargs):
# 复杂请求 例如post请求
# 1、先发options请求,服务端进行预检(不带数据)
# 2、通过后,在发送post请求 (带数据)
#最好交给中间件来设置这些
response['Access-Control-Allow-Origin'] = "*" # 解决CORS同源策略方式之一
response['Access-Control-Allow-Headers'] = 'content-type' # 尽量不要写 * ,请求头有多少这里就写多少,逗号分隔
response['Access-Control-Allow-Methods'] = '*' # 判断可以通过的请求方式
return Response('PUT请求,响应内容')
如果想要对全局进行配置,则需要再配置文件中写入即可
in settings.py
REST_FRAMEWORK = {
'UNAUTHENTICATED_USER': None, #默认user
'UNAUTHENTICATED_TOKEN': None, # 默认auth
#认证
# "DEFAULT_AUTHENTICATION_CLASSES": [
# "app01.views.MyAuthentication",
# ],
#权限
# "DEFAULT_PERMISSION_CLASSES": [
# "app01.utils.TestPermission",
# ],
#限流
'DEFAULT_THROTTLE_RATES':{
'myscope_anon':'5/minute',
'myscope_user':'10/minute',
},
#版本
'DEFAULT_VERSION':'v1',
'ALLOWED_VERSIONS':'[v1,v2]',
'VERSION_PARAM':'version',
# 'DEFAULT_VERSIONING_CLASS':"rest_framework.versioning.QueryParameterVersioning",
# 'DEFAULT_VERSIONING_CLASS':"rest_framework.versioning.URLPathVersioning",
#解析器 parser
'DEFAULT_PARSER_CLASSES':[
'rest_framework.parsers.JSONParser',
'rest_framework.parsers.FormParser',
],
#每页默认显示几条数据
'PAGE_SIZE':1,
}