DRF初识,以及CORS

2019-09-28  本文已影响0人  上帝大人
  • 普通开发方式(前后端一起写)
  • 前后端分离
  • 永远返回HttpResponse
  • 为前端提供url( API的开发,接口的开发 )
  • 基于函数的视图
  • 基于类的视图
    它是基于反射实现的,根据请求方法的不同,执行不同的函数。
    原理:
    url --> as_view方法-->view方法 -->dispatch方法(根据反射执行其它方法,get,post,put,delete...)
    面向对象
  • 对同一类方法封装到类中
class File():
      def add()
      def delete()
      def update()
      def get() 
  • 将数据封装到对象中
对象是类的实例,也就是说实例化的时候将数据封装到对象中
class File():
      def __init__(self,a1,a2):
          self.a1 = a1
          self.a2 = a2

当实例化对象的时候
obj1 = File(123,666) #
obj2 = File(234,888)  #将数据分装到了对象中

Restful api

常见的状态码:

200:请求成功; 201新建或者修改数据成功; 202 一个请求已经进入排队; 204 用户删除数据成功; 401 用户权限不足 403 访问禁止 404 请求的数据不存在 ; 410 :请求的资源被永久删除; 500 内部服务器错误。

code自定义:

{ ' 1000 ': 'error' }

[ 
  { 
        id :1
        name :'the'
   },
  { 
        id :2
        name :'he'
   }
]

用户访问/order/1可获得id为1的订单的详细信息

{
  id : 1
  name:'the'
  count:9
  price:199
}

现在这种方式就是不友好的,下面这中有一个连接,就是友好的。

[ 
  { 
        id :1
        name :'the'
        url:'https://www.example.com/order/1'
   },
  { 
        id :2
        name :'he'
  url:'https://www.example.com/order/1'
   }
]

面试:谈谈对restful api的认识谈谈怎么实现跨站资源共享CORS

他本质上就是一些规范,让url更加的具体详细,容易区分,前后端交互更加简洁。

  • 使用了PUT,DELETE,PATCH,OPTIONS,CONNECT, TRACE任意一种http方法。
  • 人为设置了对CORS安全的首部字段集合之外的其他首部字段。
  • Content-Type的值不属于下列之一:application/x-www-form-urlencoded
    multipart/form-data
    text/plain

https://segmentfault.com/a/1190000015597029四种解决跨站请求访问

http://www.ruanyifeng.com/blog/2016/04/cors.htmlCORS跨站资源共享解决跨域问题

服务器的处理机制,当用户来了一个请求,先检查http头有没有origin字段,没有或者不允许,就是简单请求,

如果有且是允许的,那再看看是不是预检请求,如果是,发送Alllow-Headers,Allow-Method,内容为空
option也会携带Access-Control-Request-Method, Access-Control-Request-Headers头部和方法信息,如果服务器返回的Alllow-Headers,Allow-Method包含它,那么就是允许跨域的。

如果不是那就是简单请求,返回Allow-Orgin,Allow-Credentials(true相应,false不响应)

rest framework 源码流程

from restframework import APIView
写CBV类的时候继承APIView,他其实就是View的子类,但是丰富了一些内容

url匹配,执行CBV的as_view方法,as_view方法返回的是一个内部函数view,这个内部函数执行dispatch()方法。

APIView的dispatch方法中将request对象作了加工,返回了一个Request()的对象,对象中包含了原来的request,想要调用就要使用request(新)._request。

上一篇 下一篇

猜你喜欢

热点阅读