django两种开发模式:
一、前后端不分离项目
二、前后端分离项目
什么是restful规范?
在前后端不分离的项目中,网页所需要的数据可以直接通过模板渲染的方式传递到前端页面,并且可以很好的支持django自带的各种验证工具,比如csrfmiddleware
但在前后端分离的项目中,前后端的数据通信普遍通过json字符串的形式通信,那么我们就需要有个标准去定义前后端沟通方式或者说格式
restful就是来干这件事情的,它是一种面向资源的架构,规定API如何编写,通过它我们可以让api更加简洁可维护,是对于我们写程序的一些规范
再次强调,restful规范只是一种规范,并不是强制性的,各公司可以结合自身需要去做适配和调整
它对于接口规范的影响深刻,绝大多数公司开发都沿用了这项规范,所以这往往也是面试官喜欢问的问题之一
restful规范10条:
1、API与用户的通信协议,总是使用HTTPS协议--数据更安全
2、域名有区分:
-https://api.example.com
-https://example.org/api/
3、版本:
可以放在路径中
-https://api.example.com/v1/zoos 这里的v1即是表示接口版本
也可以放在请求头中
4、通过method区分是什么操作
-get 表示获取资源
-post 表示新增
-put/patch表示更新
-delete表示删除
5、路径、视网络上的所有东西都是资源,用名词表示
-https://api.example.com/v1/zoos 这里的zoo即是名词,不再出现动词表示操作了
例如获取id为1的书籍
https://api.example.com/v1/books/1 # 这是用get请求表示请求资源,如果是delete请求即表示将这本书删除
6、过滤,在路径上传参的形式传递搜索条件
https://www.baidu.com/s?wd=python&rsv_spt=1
7、返回状态码:
{"status_code":100}
8、正确错误与否都应返回相应信息
{"status_code":100,"message":"登陆成功!"} {"status_code":101,"message":"登陆失败!密码错误!"}
9、返回结果,针对不同的请求,服务器向用户返回结果
# -get获取所有资源/get获取一个资源 请求 -127.0.0.1/api/vi/books 获取所有图书 结果 {"status_code":100,'msg':'获取成功',data:[{},{}]} 请求 -127.0.0.1/api/vi/books/3 获取id为3的图书 结果 {"status_code":100,'msg':'获取成功',data:{name:xx,....}} # -新增数据,把新增的数据再返回 # -修改了数据,返回完整的资源对象 # -删除数据,返回一个空文档
10、返回结果中提供链接
什么是rest_framework?
它是基于Django的一种服务框架,可以帮助我们快速开发符合RESTful规范的接口框架。
功能:
1.路由
2.视图
3.版本
4.认证
5.权限
6.频率
7.解析器
8.序列化
9.分页
10.渲染器
drf (django rest_framework):
APIView 的源码,Requset的源码
-安装:
-pip3 install djangorestframework
-pycharm中安装
-使用
-第一步,再写视图,都写cbv
from rest_framework.views import APIView class Books(APIView): pass
-第二步,在setting中配置,rest_framework实质上是一个app,需要注册才可以使用
INSTALLED_APPS= [ 。。。。。 'rest_framework' ]
-源码分析:
视图类继承了APIView 之后:
-1 所有的请求都没有csrf的认证了
-2 在APIView中as_view本质还是调用了父类的as_view(View的as_view)
-3 as_view中调用dispatch ----->>>这个dispatch是APIView的dispatch
-APIVIew的dispatch方法:
1 对原生request对象做了一层包装(面向对象的封装),以后再用的request对象都新的request对象
-2 在APIView中self.initial(request, *args, **kwargs),里面有频率控制,权限控制和认证相关
-3 根据请求方法执行咱们写的视图类中的相应方法
--视图类中方法的request对象,已经变成了封装后的request
-Request类:
-1 原生的request是self._request
-2 取以post形式提交的数据,从request.data中取(urlencoded,formdata,json格式)
-3 query_params 就是原生request的GET的数据
-4 上传的文件是从FILES中取
-5 (重点)其他的属性,直接request.属性名(因为重写了__getattr__方法)