Django RestFramework (DRF)
准备:
下载 pip install djangorestframework
一 APIView源码解析
1 预备知识
CBV(class based view)
FBV(function based view)
2 CBV源码
class LoginView(View): def get(self,request): return render(request,"login.html") url(r'^index/', views.index), #url(r'^login/', views.LoginView.as_view()), #url(r'^login/', View.view), 一旦用户get访问login: #login-----》view(request): self = cls(**initkwargs) return self.dispatch(request, *args, **kwargs): # 分发 handler = getattr(self, request.method.lower()) return handler(request, *args, **kwargs): def get(self,request): return render(request,"login.html")
3 restful协议
1 所有的数据,不过是通过网络获取的还是操作(增删改查)的数据,都是资源,将一切数据视为资源是REST区别与其他架构风格的最本质属性
2 面向资源架构(ROA:Resource Oriented Architecture)
3
不符合规范:
127.0.0.1:8000/books
127.0.0.1:8000/books/add/
127.0.0.1:8000/books/change/1
127.0.0.1:8000/books/delete/1
http协议请求方式:GET POST,DELETE,PUT,PATCH,OPTION.HEAD
GET:查看数据
POST:提交数据添加数据库
GET
books-------->查看数据--------------------> 返回所有数据列表 :[{},{},{}]
POST
books-------->添加数据--------------------->返回添加数据 :{}
PUT
books/1------->更新pk=1的数据--------------->返回更新后的数据: {}
Delete
books/1-------> 删除pk=1的数据-------------->返回空
GET
books/1------->查看单条数据 --------------->返回查看的单条数据 {}
4 Django RestFramework (DRF)--------------app
(1) APIView (*****)
(2) 序列化组件(*****)
(3) 视图类(mixin)(*****)
(4) 认证组件
(5) 权限组件
(6) 频率组件
(7) 分页组件
(8) 解析器组件(*****)
(9) 响应器组件
(10) url控制器
class CourseView(APIView):
def get(self,request):
course_list=Course.objects.all()
ret=[]
for course in course_list:
ret.append({
"title":course.title,
"desc":course.desc,
})
return HttpResponse(json.dumps(ret,ensure_ascii=False))
----APIView:
# url(r'^courses/', views.CourseView.as_view()),
# url(r'^courses/', APIView.as_view()),
# url(r'^courses/', APIView.as_view()),
# url(r'^courses/', View.view),
一旦用户访问:
courses--------> view(reqeust):
self = cls(**initkwargs)
return self.dispatch(request, *args, **kwargs) # APIView.dispatch()
def dispatch(request, *args, **kwargs):
# 1 重装一个新的request对象
# 2 认证组件,权限组件,频率组件
handler = getattr(self, request.method.lower())
response = handler(request, *args, **kwargs)
return response
csrf_exempt(view)
如果有csrf_token则,正常返回数据
没有则返回空数据
二 解析器组件
http协议的数据发送:
问题:如何发送json数据服务器
基于http协议
BS架构: Browser ------------------ Server
b'''
POST /login/ HTTP/1.1
...
...
contentType:application/x-www-form-urlencoded
user=yuan&pwd=123&a=1
contentType:application/json
{"user":"yuan","pwd"}
'''
JS Python
JSON.Stringfy(data) ============ json.dumps(data)
JSON.parser(data) ============ json.loads(data)
Django默认解析器:
if contentType:application/x-www-form-urlencoded:
user=yuan&pwd=123&a=1 -----》request.POST={"user":"yuan","pwd"}
else:
request.POST={}
解析器组件功能:
预备知识
1 request.body:可以得到请求体中的原生数据
2 django自带的解析只支持,不支持json等其他类型
contentType:application/x-www-form-urlencoded
contentType:multipart/form-data
3 ajax中定义发送数据的类:contentType
4 js的json序列化:JSON.stringify({name:'alex',pwd:'122'})
解析器组件:
可以解析json等各种类型的数据