答:API是接口,提供url.
接口有两个用途:
为别人提供服务,先后端分离。
答:主要为了数据的解耦,提升开发效率。
若是更新了数据,web页面须要更改,并且网站的前端页面变更很大,后端也可能更改,会很是麻烦。
使用前端框架VUE.js,能快速搭建前端项目,不须要依赖后端。
后端只需作序列化,返回json数据便可,并不涉及更多操做。
答:以前咱们是没有用rest api规范的,都是经过django的url本身来作的,后来咱们选择用了rest api。 (1):API与用户的通讯协议,使用的是http协议 (2):域名尽可能部署在专有域名之下,若API很简单,不会进一步扩展,能够考虑放在主域名下。 (3):应将api的版本号放入url,还能够将版本号放入Http请求头信息中,但不如放在url中方便。 也能够放在子域名上(放在子域名上会存在跨域的问题,) (4):在RESTful架构中,每一个网址表明一种资源(resource),因此网址中不能有动词,只能有名词, 并且所用的名词每每与数据库的表格名对应。通常来讲, 数据库中的表都是同种记录的"集合",因此API中的名词也应该使用复数。 (5):若是记录数量不少,服务器不可能都将它们返回给用户。API应该提供参数,过滤返回结果。 (6)根据请求方式的不一样,来区分不一样的行为。post----get----put----patch----delete。 (7):服务器向用户返回的状态码和提示信息。 (8):返回json数据。
答:Get :获取数据,Post:建立数据,Patch:部分修改
Put :所有修改,DELETE:删除数据,
Options:若是有跨域,会先发一个option请求,先作预检,完了在执行本身发的请求
答:200:响应成功,302:重定向,403:Forbidden
404:找不到页面,500:服务端代码有误
答:咱们一开始是没有用restful framework,
用django写一些装饰器或中间件也能实现。
可是它为咱们事先提供了一部分接口,
经常使用的有:获取版本,认证,权限,分流 ,
咱们只须要按照restful的规范,只须要写几个类就行了,或者在配置文件里面配置一下就可使用。
尤为是在用户访问频率限制的时候,restful里面都已经封装好了,咱们直接调用它的方法就好了。
咱们写的时候是基于CBV模式写的,这个和django中的CBV是同样的,
请求先进来会走dispatch方法,根据请求方法不一样反射执行不一样的方法。
咱们写的类是继承APIView的View,去执行它的dispatch先找本身的,本身没有就找父类的。
restful framework执行流程?
restful framework请求进来到达路由.as_view(),在as_view里面return了一个view函数,请求进来先执行一个view函数。
as_views调用了dispath方法根据请求方式的不一样,触发不一样的方法。
initialize_request这个方法接收客户端的request请求,再从新封装成新的request。请求一些相关的东西放到request中
而后进行初始化,获取版本,认证调用request.user方法,检查权限,检查限制访问。
执行对应视图函数。
对返回结果再次进行加工。重要的功能在APIviews的dispath中实现。
TTP请求 —> wsgi —> 中间件 —> 路由分发 —> 执行对应类的dispatch方法 —> 视图函数 —>返回
采用CBV的请求方式。
通过“中间件”时,依次执行中间件内部的 process_request--->process_view--->process_template_response
---->process_exception---->process_response
答:有版本,认证,权限,访问频率的限制,路由系统,视图,渲染器,序列化,分页,解析器。
答:执行认证功能,确认进行后续操做的用户是被容许的,perform_authentication方法返回通过认证的用户对象,
传入的request是从新封装过的。
功能的更新迭代。
能够放在url,也能够放在请求头,但不是很方便,也能够放在子域名上,但存在跨域的问题。
能够用三种方法实现:get传参方式,基于url正则传参
若是url中有版本信息,就获取发送到服务端的版本,返回一个元组.
答:若是用户经过认证,检查用户是否有权限访问url中所传的路径,如用用户访问的是没有没有权限的路径,则会抛出异常。
答:做用是检查用户是否被限制了访问主机的次数。
答:对请求数据进行解析,对请求体进行解析。
答:有两种方法实现 一:从数据去取出数据,return response 二:从数据库求出数据,赋值给instance,设置是不是单对象,再进行赋值,而后return response(.data)返回。 ser = UsersSerializer(instance=user_list,many=True) return Response(ser.data)
答:解决QuerySet序列化问题。 序列化: 基本序列化:单对象,多对象。instance=user_list,many=True 跨表序列化: 复杂序列化: 基于Model实现序列化: 生成url: 所有生成url: 请求数据验证: