1. API与用户的通信协议,https协议 2. 域名 https://api.example.com 尽量将API部署在专用域名 https://example.org/api API简单 3. 版本 https://api.example.com/v1/ v1: 版本 把版本放在请求头中 4. 路径,网络上任何东西都是资源,均使用名词表示(可复数) 127.0.0.1/books/ (使用名词books,而不是get_books) 5. 请求方式method: 通过请求方式来表示相应操作 127.0.0.1/books/ get: 获取图书 (服务器取出资源) post: 表示新增一本书 (服务器新建一个资源) delete: 表示删除一本书 (服务端删除资源) put/patch: 表示修改一本书(服务器更新资源) 6. 过滤,通过url上传参的形式传递搜索条件 7. 状态码: 1开头: 服务器正在处理 2开头: 服务器处理成功 3开头: 重定向 4开头: 客户端错误 5开头: 服务器错误 --- 注意: 返回的数据中携带状态码 8. 错误处理,应返回错误信息,error当做key 9. 返回结果: 针对不同操作,返回数据格式要求 GET/collection: 返回资源对象的列表(数组) GET/collection/resource: 返回单个资源对象 POST/collection: 返回新生成的资源 PUT/collection/resource: 返回完整的资源对象(PATCH一样) DELETE /collection/resource: 返回一个空文档 10. 在返回结果中提供链接,Hypermedia API 小结: 路径都用名词表示,请求方式不同表示不同的操作
def books(request): if request.method == 'GET': LL= [{'id':1,'title':'python'}] return JsonResponse(LL,safe=False,json_dumps_params={'ensure_ascii':False}) 注意:restful 要求GET 返回资源对象的列表
class Books(View): def dispatch(self,request,*args,**kwargs): print(1) obj = super().dispatch(request,*args,**kwargs) print(2) return obj def get(self,request): return def post(self,request): return 1. 路由: url(r'^books/', views.Books.as_view()), 2. 当程序启动,as_view() 已经执行,返回一个函数(view)的内存地址 3. 当来请求(get,post),view加括号执行, 即内部dispatch方法执行, 4. dispatch 方法通过判断小写是否在http_method_names = ['get', 'post', 'put', 'patch', 'delete', 'head', 'options', 'trace'] 中,用getattr 将字符串隐射成为 get 或post 或其他的函数内存地址, return的结果就是调用get(),post()...
在原来django框架的基础上(在继承View基础上),多做了一些事 drf 提供的: 序列化组件 | 视图组件 | 解析器 | 认证组件 | 权限组件 | 频率组件 | 分页器 | 响应器 | url控制器 | 版本控制 安装: pip install djangorestframework 实质是一个app settings中注册 INSTALLED_APPS = 'rest_framework', 只要用drf, 都是cbv # 基于drf 写的cbv---继承APIView (唯一区别) from rest_framework.views import APIView class Books(APIView) 小结: 基于drf写的cbv: 首先安装: pip install djangorestframework 然后注册: 'rest_framework' 继承: from rest_framework.views import APIView
1. 路由: url(r'^books/', views.Books.as_view()), 2. 继承APIView: class Books(APIView) 3. as_view() 走的是APIView 中的as_view 方法, return csrf_exempt(view) 取消局部认证的装饰器 即: 只要继承了APIView ,就都没有csrf的验证了 4. 当来请求(get,post), 上步得到的view 函数执行,即内部dispatch方法执行--- 此时的dispatch方法是APIView中的方法 5. request = self.initialize_request(request, *args, **kwargs) 被包装后的request(里面包含原来的request) 6. self.initial(request, *args, **kwargs) 该方法中进行了 认证,权限,频率,进行阻拦 7. 用getattr 将字符串隐射成为 get 或post 或其他的函数内存地址,返回调用的结果 小结: class Books(APIView) def get(request): pass 1. 一旦继承了APIView, get 方法中的request是处理过后的request 2. 原来的request, _request = request 3. request.GET 等价 request._request.GET, 原因如下: 点拦截属性, setattr and getattr, 如果没有,就会走__getattr__ 新的request 对象 重新写了 __getattr__方法, 把 _request 返回了 4. request.data data是post, put 的内容,字典形式 注意: 以后用 request.data 取出原来在 POST中的内容