详解DjangoRESTframework框架
1.Web应⽤模式,
在开发Web应⽤中,有两种模式:
1.1前段后端不分离(耦合度⾼,适合纯⽹页的应⽤!)
image.png
在前后端不分离的应⽤模式中,前端页⾯看到的效果都是由后端控制,由后端渲染页⾯或重定向,也就是后端需要控制前端的展⽰,前端与后端的耦合度很⾼。
应⽤场景分析:
这种应⽤模式⽐较适合纯⽹页应⽤,但是当后端对接App时,App可能并不需要后端返回⼀个HTML⽹页,⽽仅仅是数据本⾝,所以后端原本返回⽹页的接⼝不再适⽤于前端App应⽤,为了对接App后端还需再开发⼀套接⼝。
1.2前段后端分离(耦合度低,前端通过访问接⼝来对数据进⾏增删改查)
image.png
在前后端分离的应⽤模式中,后端仅返回前端所需的数据,不再渲染HTML页⾯,不再控制前端的效果。⾄于前端⽤户看到什么效果,从后端请求的数据如何加载到前端中,都由前端⾃⼰决定,⽹页有⽹页的处理⽅式,App有App的处理⽅式,但⽆论哪种前端,所需的数据基本相同,后端仅需开发⼀套逻辑对外提供数据即可。
在前后端分离的应⽤模式中 ,前端与后端的耦合度相对较低。
在前后端分离的应⽤模式中,我们通常将后端开发的每个视图都称为⼀个接⼝,或者API,前端通过访问接⼝来对数据进⾏增删改查。
2. RESTful设计⽅法
2.1域名
应该尽量将API部署在专⽤域名之下。
2.2版本
应该将API的版本号放⼊URL。
因为不同的版本,可以理解成同⼀种资源的不同表现形式,所以应该采⽤同⼀个URL。版本号可以在HTTP请求头信息的Accept字段中进⾏区分(参见Versioning REST Services):
Accept: ample-com.foo+json; version=1.0
Accept: ample-com.foo+json; version=1.1
Accept: ample-com.foo+json; version=2.0
2.3路径
路径⼜称"终点"(endpoint),表⽰API的具体⽹址,每个⽹址代表⼀种资源(resource)
(1) 资源作为⽹址,只能有名词,不能有动词,⽽且所⽤的名词往往与数据库的表名对应。
举例来说,以下是不好的例⼦:
/getProducts
/listOrders
/retreiveClientByOrder?orderId=1
对于⼀个简洁结构,你应该始终⽤名词。 此外,利⽤的HTTP⽅法可以分离⽹址中的资源名称的操作。
GET /products :将返回所有产品清单
POST /products :将产品新建到集合
GET /products/4 :将获取产品 4
PATCH(或)PUT /products/4 :将更新产品 4
(2) API中的名词应该使⽤复数。⽆论⼦资源或者所有资源。
举例来说,获取产品的API可以这样定义
2.4 HTTP动词
对于资源的具体操作类型,由HTTP动词表⽰。
常⽤的HTTP动词有下⾯四个(括号⾥是对应的SQL命令)。
GET(SELECT):从服务器取出资源(⼀项或多项)。
POST(CREATE):在服务器新建⼀个资源。
PUT(UPDATE):在服务器更新资源(客户端提供改变后的完整资源)。
DELETE(DELETE):从服务器删除资源。
还有三个不常⽤的HTTP动词。
PATCH(UPDATE):在服务器更新(更新)资源(客户端提供改变的属性)。
HEAD:获取资源的元数据。
OPTIONS:获取信息,关于资源的哪些属性是客户端可以改变的。
下⾯是⼀些例⼦。
GET /zoos:列出所有动物园
POST /zoos:新建⼀个动物园(上传⽂件)
GET /zoos/ID:获取某个指定动物园的信息
PUT /zoos/ID:更新某个指定动物园的信息(提供该动物园的全部信息)
PATCH /zoos/ID:更新某个指定动物园的信息(提供该动物园的部分信息)
DELETE /zoos/ID:删除某个动物园
GET /zoos/ID/animals:列出某个指定动物园的所有动物
DELETE /zoos/ID/animals/ID:删除某个指定动物园的指定动物
2.5 过滤信息
如果记录数量很多,服务器不可能都将它们返回给⽤户。API应该提供参数,过滤返回结果。
下⾯是⼀些常见的参数。
limit=10:指定返回记录的数量
offset=10:指定返回记录的开始位置。
page=2&per_page=100:指定第⼏页,以及每页的记录数。
sortby=name&order=asc:指定返回结果按照哪个属性排序,以及排序顺序。
animal_type_id=1:指定筛选条件
参数的设计允许存在冗余,即允许API路径和URL参数偶尔有重复。⽐如,GET /zoos/ID/animals 与 GET /animals?zoo_id=ID 的含义是相同的。
2.6 状态吗
服务器向⽤户返回的状态码和提⽰信息,常见的有以下⼀些(⽅括号中是该状态码对应的HTTP动词)。
200 OK - [GET]:服务器成功返回⽤户请求的数据
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 - [*]:服务器发⽣错误,⽤户将⽆法判断发出的请求是否成功。
状态码的完全列表参见这⾥或这⾥。
return JsonResponse(book_list, safe=False)
def post(self, request):
"""
新增图书
路由:POST /books/
"""
json_bytes = request.body
json_str = json_bytes.decode()
book_dict = json.loads(json_str)
# 此处详细的校验参数省略
book = ate(
btitle=('btitle'),
bpub_date=datetime.strptime(('bpub_date'), '%Y-%m-%d').date()
)
return JsonResponse({
'id': book.id,
'btitle': book.btitle,
'bpub_date': book.bpub_date,
'bread': book.bread,
'bcomment': book.bcomment,
'image': book.image.url if book.image else ''
}, status=201)
class BookAPIView(View):
def get(self, request, pk):
"""
获取单个图书信息
路由: GET  /books/<pk>/
"""
try:
book = (pk=pk)
except BookInfo.DoesNotExist:
return HttpResponse(status=404)
return JsonResponse({
'id': book.id,
'btitle': book.btitle,
'bpub_date': book.bpub_date,
'bread': book.bread,
'bcomment': book.bcomment,
'image': book.image.url if book.image else ''
})
def put(self, request, pk):
"""
修改图书信息
路由: PUT  /books/<pk>
前端有哪些常用框架
"""
try:
book = (pk=pk)
except BookInfo.DoesNotExist:
return HttpResponse(status=404)
json_bytes = request.body
json_str = json_bytes.decode()
book_dict = json.loads(json_str)
# 此处详细的校验参数省略
book.btitle = ('btitle')
book.bpub_date = datetime.strptime(('bpub_date'), '%Y-%m-%d').date()      book.save()
return JsonResponse({
'id': book.id,
'btitle': book.btitle,
'bpub_date': book.bpub_date,
'bread': book.bread,

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。