rest
Django 中的FBV和CBV
FBV
- FBV(fuction base view ) 就是在视图里使用函数处理请求
from django.http import render
def index(request):
if request.method == 'POST':
pass
return render(request, 'index.html',locals())
CBV
- CBV(class base views) 就是在视图里使用类处理请求
from django.http import render
from django.views import View
class PublishView(View):
def get(self, request):
return render(request, 'index.html', locals())
def post(self, request):
pass
-
Python是一个面向对象的编程语言,仅使用函数编程,将无法使用到面向对象编程的特性(封装、继承、多态),所以推荐使用类来编写View。
-
优点:
-
提高代码的复用性 ,可以使用面向对象的特性,比如Mixin(多继承)
-
可以使用不同的函数处理针对不同的http方法处理,避免使用多个if,提高代码的可读性
django处理请求的函数
-
Django的url是将一个请求分配给可调用的函数的,而不是一个class。针对这个问题,class-based view提供了一个as_view()静态方法(也就是类方法),调用这个方法,会创建一个类的实例,然后通过实例调用dispatch()方法,dispatch()方法会根据request的method的不同调用相应的方法来处理request(如get() , post()等)。到这里,这些方法和function-based view差不多了,要接收request,得到一个response返回。如果方法没有定义,会抛出HttpResponseNotAllowed异常。
-
在url中就这么写:
from django.http import HttpResponse
from django.views import View
class MyView(View):
def get(self, request):
return HttpResponse('OK')
- View视图:
# urls.py
from django.conf.urls import url
from myapp.views import MyView
urlpatterns = [
url(r'^index/$', MyView.as_view()),
]
RESTful规范
什么是RESTful
-
REST与技术无关,代表的是一种软件架构风格,REST是Representational State Transfer的简称,中文翻译为“表征状态转移”
-
REST从资源的角度类审视整个网络,它将分布在网络中某个节点的资源通过URL进行标识,客户端应用通过URL来获取资源的表征,获得这些表征致使这些应用转变状态
-
REST与技术无关,代表的是一种软件架构风格,REST是Representational State Transfer的简称,中文翻译为“表征状态转移”
-
所有的数据,不过是通过网络获取的还是操作(增删改查)的数据,都是资源,将一切数据视为资源是REST区别与其他架构风格的最本质属性
-
对于REST这种面向资源的架构风格,有人提出一种全新的结构理念,即:面向资源架构(ROA:Resource Oriented Architecture)
RESTful API设计
-
API与用户的通信协议,总是使用HTTPs协议。
-
域名
-
https://api.example.com 尽量将API部署在专用域名(会存在跨域问题)
-
版本
-
请求头 跨域时,引发发送多次请求
-
路径,将网络上的任何资源都视为资源,均使用名词表示(复数)
-
method
-
GET :从服务器取出资源(一项或多项)
-
POST :在服务器新建一个资源
-
PUT :在服务器更新资源(客户端提供改变后的完整资源)
-
PATCH :在服务器更新资源(客户端提供改变的属性)
-
DELETE :从服务器删除资源
-
-
过滤,通过在URL上传参的形式传递搜索条件
-
状态码
-
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"
}
- 返回结果,针对不同操作,服务器向用户返回的结果应符合以下规范
- GET /collection:返回资源对象的列表(数组)
- GET /collection/resource:返回单个资源对象
- POST /collection:返回新生成的资源对象
- PUT /collection/resource:返回完整的资源对象
- PATCH /collection/resource:返回完整的资源对象
- DELETE /collection/resource:返回一个空文档
- Hypermedia API,RESTful API最好做到Hypermedia,即返回结果中提供链接,连向其他API方法,使得用户不查文档,也知道下一步应该做什么
- ``` python
{"link": {
"rel": "collection https://www.example.com/zoos",
"href": "https://api.example.com/zoos",
"title": "List of zoos",
"type": "application/vnd.yourformat+json"
}}```
## rest-framework框架

浙公网安备 33010602011771号