Django RESTful规范
Django生命周期

- 先进入实现了wsgi协议的web服务器
- 进入Django
- 中间件
- 路由
- 视图函数
- 取模板,取数据,用数据渲染模板
- 返回模板的字符串
开发模式
- 前后端不分离项目
- 前后端分离项目(前端和后端通过json格式数据交互)
CBV源码分析
cbv路由配置:url(r’^test/’, views.Test.as_view()),
-
请求通过中间件进入路由
-
根据路由匹配,匹配成功执行后面函数(自动传入request)
as_view()返回的结果就是--—> view,本质就是执行了as_view内部的view函数
-
view内部又调用了self.dispatch(类的查找:不管什么时候调用什么先去自己类里面找,没有就去自己的父类里面找)
-
根据请求方式,执行不同的方法(会执行自己写的视图类的方法)
补充:重写dispatch方法,可以再执行父类的dispatch之前,进行一些逻辑判断((最后要重用父类dispatch方法)
restful规范
REST与技术无关,代表的是一种软件架构风格,对于REST这种面向资源的架构风格,有人提出一种全新的结构理念,即:面向资源架构
restful API设计规范
-
API与用户的通信协议,总是使用HTTPs协议
-
域名有区别
- https://api.example.com 尽量将API部署在专用域名(会存在跨域问题)
- https://example.org/api/ API很简单
-
版本
- 可以放在路径(URL)中 如:https://api.example.com/v1/
- 可以放在请求头中
-
路径,视网络上任何东西都是资源,均使用名词表示(重点)
-
通过method区分操作种类
- GET:从服务器取出资源(一项或多项)
- POST:在服务器新增一个资源
- PUT:在服务器更新资源(客户端提供改变后的完整资源)
- PATCH:在服务器更新资源(客户端提供改变的属性)
- DELETE:从服务器删除资源
-
过滤,通过在url上传参的形式传递搜索条件
-
状态码
-
错误处理,应返回错误信息
-
返回结果,针对不同操作,服务器向用户返回的结果
-
-get获取所有资源/get获取一个资源
-127.0.0.1/api/vi/books 获取所有图书 -127.0.0.1/api/vi/books/3 获取id为3的图书
{“status_code”:100,’msg’:’获取成功’,data:{name:xx,..….}} -
-新增数据,把新增的数据再返回
-
-修改了数据,返回完整的资源对象
-
-删除数据,返回一个空文档
-
-
返回结果中提供链接
基于原生django开发restful的接口
def books(request):
# 获取所有图书
if request.method=='GET':
books=models.Book.objects.all()
ll=[{'name':book.name,'publish':book.publish} for book in books]
response={'code':100,'msg':'查询成功','data':ll}
# safe=False 如果序列化的对象中有列表,需要设置safe
# 如果有中文,可以通过json_dumps_params传入,内部代码会解压赋值
return JsonResponse(response,safe=False,json_dumps_params={'ensure_ascii':False})
drf:APIView的源码,Request的源码
-
安装
- -pip3 install djangorestframework
- -pycharm中安装
-
使用
-
写视图函数,都要写CBV
from rest_framework.views import APIView class Books(APIView): pass -
在setting中配置
INSTALLED_APPS= [ 。。。。。 'rest_framework' ]
-
源码分析
-
继承了APIView之后:
- 所有的请求都没有csrf的认证
- 在APIView中as_view本质上还是调用了父类的as_view(View的as_view)
- as_view中调用dispatch -–-–> 这个dispatch是APIView中的dispatch
-
APIView的dispatch方法
-
对原生request对象做了一层包装(面向对象的封装),以后再用的request对象都是新的request对象
-
在APIviiew中self.initial(request,*args,**kwargs),里面有频率,控制,权限控制和认证相关的方法
-
根据请求方法执行自己写的视图类中的相应方法
- 视图类中方法的request对象,已经变成了封装后的request
-
-
Request类:
- 原生的request是self._request
- 取以post形式提交的数据,从request.data中取(urlencoded,formdata,json格式均在data中)
- query_params就是原生request中的GET的数据
- 上传的文件是从FILES中取
- (重点)其他的属性,直接request.属性名(因为重写了 _ getattr _方法)

浙公网安备 33010602011771号