django rest framemark

Posted 方杰0410

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了django rest framemark相关的知识,希望对你有一定的参考价值。

一 内容回顾

 1 开发者模式

  普通开发方式:前后端放在一起开发

  前后端分离:前后端只通过 JSON 来交流,组件化、工程化不需要依赖后端去实现

 2 后端开发:为前端提供url接口,也就是API或者接口的开发。永远返回HttpResponse。

 3 django的FBC和CBV

  FBV也就是:function base view的缩写,也就是视图函数。方法如下:

# def users(request):
#     user_list=[‘alex‘,‘oldboy‘,‘egon‘]
#     return HttpResponse(json.dumps(user_list))

   CBV也就是:class base view的缩写,也就是类的视图。方法如下:

    注:写的类需要继承View内置的类的方法。在url中使用:类名.as_view()

  在views.py文件中:

   View的导入:from django.views impost View

# class StudentView(View):
# 
#     def get(self,request,*args,**kwargs):
#         return HttpResponse(‘GET‘)
# 
#     def post(self,request,*args,**kwargs):
#         return HttpResponse(‘POST‘)
# 
#     def delete(self,request,*args,**kwargs):
#         return HttpResponse(‘DELETE‘)
# 
#     def put(self,request,*args,**kwargs):
#         return HttpResponse(‘PUT‘)

  在url.py文件中:

url(r‘^student/‘, views.StudentView.as_view()),

 CBV补充:CBV是基于反射实现根据请求方式不同,执行不同的方法。

  原理:也就是执行的顺序是url -> view方法 -> dispatch方法(反射执行其他:GET/POST/DELETE/PUT)

  流程如下:

class StudentView(View):
    def dispatch(self, request, *args, **kwargs):
        ret=super(StudentView,self).dispatch(request, *args, **kwargs)
        return ret

    def get(self,request,*args,**kwargs):
        return HttpResponse(‘GET‘)

    def post(self,request,*args,**kwargs):
        return HttpResponse("POST")

    def put(self,request,*args,**kwargs):
        return HttpResponse("PUST")

    def delete(self,request,*args,**kwargs):
        return HttpResponse(‘DELETE‘)

  继承:多个类的共同功能,为了避免重复写代码,如下:

class MyBaseView:
    def dispatch(self,request,*args,**kwargs):
        print(‘before‘)
        ret=super(MyBaseView,self).dispatch(request,*args,**kwargs)
        print(‘after‘)
        return ret

class StudentView(MyBaseView,View):
    def get(self,request,*args,**kwargs):
        print(‘get方法‘)
        return HttpResponse(‘GET‘)

    def put(self, request, *args, **kwargs):
        print(‘put方法‘)
        return HttpResponse(‘PUT‘)

    def post(self, request, *args, **kwargs):
        print(‘post方法‘)
        return HttpResponse(‘POST‘)

    def delete(self, request, *args, **kwargs):
        print(‘delete方法‘)
        return HttpResponse(‘DELETE‘)

 4 列表生成式:

class Foo:
    def __init__(self):
        pass

    def work(self):
        print(‘this is working‘)


class Bar:
    def __init__(self):
        pass

    def ect(self):
        print(‘this is ecting‘)


objs=[item() for item in [Foo,Bar]]
# 就相当于如下
# objs=[]
# for i in [Foo,Bar]:
#     objs.append(i())


objs[0].work()
objs[1].ect()

  5 面向对象的封装:

  1将共同的方法和属性封装到同一个类下面。

class File:
	文件增删改查方法
					
Class DB:
	数据库的方法

  2 将数据封装到数据中。实例如下:

class File:
	def __init__(self,a1,a2):
		self.a1 = a1 
		self.xxx = a2
	def get:...
	def delete:...
	def update:...
	def add:...
					
obj1 = File(123,666)
obj2 = File(456,999)

  6 ps扩展:

class Request:
    def __init__(self,obj):
        self.obj=obj
        
    
    @property
    def user(self):
        return self.obj.authticate()

class Auth:
    def __init__(self,name,age):
        self.name=name
        self.age=age
    
    def authticate(self):
        return self.name,self.age
class APIView:
    def dispatch(self):
        return self.f2()

    def f2(self):
        a=Auth(‘alex‘,33)
        ret=Request(a)
        return ret.user

obj=APIView()
print(obj.dispatch())

 二 中间件和csrf_token

 1 django中csrf_token是怎么实现的:csrf_token是在process_view里面验证的。

 2 解决csrf_token的方法:

  2.1:直接在settings文件中将下面这行代码给注释掉

‘django.middleware.csrf.CsrfViewMiddleware‘,

   2.2:通过csrf_exempt装饰器,将不需要csrf_token的试图函数上加上这个装饰器。process_view方法就会检查试图的cerf_token是否免除。

from django.views.decorators.csrf import csrf_exempt

@csrf_exempt   # 
def users(request):
    user_list=[‘alex‘,‘oldboy‘,‘egon‘]
    return HttpResponse(json.dumps(user_list))

   2.3:类的视图如果需要免除csrf_token的验证,就需要在class类使用装饰器method_decorator。不过必须要加上dispatch这个方法。加在单独的方法上面无效。

   使用方法一:直接加在类里面的dispatch方法上面

from django.views.decorators.csrf import csrf_exempt
from django.utils.decorators import method_decorator
# method_decorator 装饰器使用方法一:
class StudentView(View):

    @method_decorator(csrf_exempt)
    def dispatch(self,request,*args,**kwargs):
        ret=super(StudentView,self).dispatch(request,*args,**kwargs)
        return ret

    def get(self,request,*args,**kwargs):
        return HttpResponse(‘GET‘)

    def post(self,request,*args,**kwargs):
        return HttpResponse(‘POST‘)

    def put(self,request,*args,**kwargs):
        return HttpResponse(‘PUT‘)

    def delete(self,request,*args,**kwargs):
        return HttpResponse(‘DELETE‘)

  使用方法二:在class类上面加上这个装饰器,不过需要多创一个属性值,@method_decorator(csrf_token,name=‘dispatch‘)

# method_decorator 装饰器使用方法二:

from django.views.decorators.csrf import csrf_exempt
from django.utils.decorators import method_decorator
@method_decorator(csrf_exempt,name=‘dispatch‘)
class StudentView(View):
    
    def get(self, request, *args, **kwargs):
        return HttpResponse(‘GET‘)

    def post(self, request, *args, **kwargs):
        return HttpResponse(‘POST‘)

    def put(self, request, *args, **kwargs):
        return HttpResponse(‘PUT‘)

    def delete(self, request, *args, **kwargs):
        return HttpResponse(‘DELETE‘)

   2.4 :csrf_protect装饰器,如果在settings文件中将‘django.middleware.csrf.CsrfViewMiddleware‘,这段代码注释掉了的话需要某个试图函数通过csrf_token的验证,就在这个视图函数上面加上这个装饰器。

from django.views.decorators.csrf import csrf_exempt
@csrf_protect # 该函数需认证
def users(request):
    user_list = [‘alex‘,‘oldboy‘]
    return HttpResponse(json.dumps((user_list)))

  3 django的中间件:如下

- process_request
- process_view
- process_response
- process_exception
- process_render_template

    django的中间件做过什么:权限;用户认证。

  process_view做过什么:检查视图是否被免除csrf_token的验证;去请求体的cookie中获取csrf_token

三 restful规范

 什么是restful:

    REST与技术无关,代表的是一种软件架构风格,REST是Representational State Transfer的简称,中文翻译为“表征状态转移”
    REST从资源的角度类审视整个网络,它将分布在网络中某个节点的资源通过URL进行标识,客户端应用通过URL来获取资源的表征,获得这些表征致使这些应用转变状态
    REST与技术无关,代表的是一种软件架构风格,REST是Representational State Transfer的简称,中文翻译为“表征状态转移”
    所有的数据,不过是通过网络获取的还是操作(增删改查)的数据,都是资源,将一切数据视为资源是REST区别与其他架构风格的最本质属性
    对于REST这种面向资源的架构风格,有人提出一种全新的结构理念,即:面向资源架构(ROA:Resource Oriented Architecture)

 restful是为了根据method的不同做这不同的操作。restful就是一个规范,只为了让我们更好的记住url。

 restful的API的设计有哪些。如下:

  1 API与用户的通信协议,总是使用HTTPs协议

  2 域名 :

    https://api.example.com                         尽量将API部署在专用域名(会存在跨域问题)
    https://example.org/api/                        API很简单

   3 版本:

    URL,如:https://api.example.com/v1/
    请求头                                                  跨域时,引发发送多次请求

   4 路径,视网络上任何东西都是资源,均使用名词表示(可复数)

    https://api.example.com/v1/zoos
    https://api.example.com/v1/animals
    https://api.example.com/v1/employees

   5 method

    GET      :从服务器取出资源(一项或多项)
    POST    :在服务器新建一个资源
    PUT      :在服务器更新资源(客户端提供改变后的完整资源)
    PATCH  :在服务器更新资源(客户端提供改变的属性)
    DELETE :从服务器删除资源

   6 过滤,通过在url上传参的形式传递搜索条件

    https://api.example.com/v1/zoos?limit=10:指定返回记录的数量
    https://api.example.com/v1/zoos?offset=10:指定返回记录的开始位置
    https://api.example.com/v1/zoos?page=2&per_page=100:指定第几页,以及每页的记录数
    https://api.example.com/v1/zoos?sortby=name&order=asc:指定返回结果按照哪个属性排序,以及排序顺序
    https://api.example.com/v1/zoos?animal_type_id=1:指定筛选条件

   7 状态码

200 OK - [GET]:服务器成功返回用户请求的数据,该操作是幂等的(Idempotent)。
201 CREATED - [POST/PUT/PATCH]:用户新建或修改数据成功。
202 Accepted - [*]:表示一个请求已经进入后台排队(异步任务)
204 NO CONTENT - [DELETE]:用户删除数据成功。
400 INVALID REQUEST - [POST/PUT/PATCH]:用户发出的请求有错误,服务器没有进行新建或修改数据的操作,该操作是幂等的。
401 Unauthorized - [*]:表示用户没有权限(令牌、用户名、密码错误)。
403 Forbidden - [*] 表示用户得到授权(与401错误相对),但是访问是被禁止的。
404 NOT FOUND - [*]:用户发出的请求针对的是不存在的记录,服务器没有进行操作,该操作是幂等的。
406 Not Acceptable - [GET]:用户请求的格式不可得(比如用户请求JSON格式,但是只有XML格式)。
410 Gone -[GET]:用户请求的资源被永久删除,且不会再得到的。
422 Unprocesable entity - [POST/PUT/PATCH] 当创建一个对象时,发生一个验证错误。
500 INTERNAL SERVER ERROR - [*]:服务器发生错误,用户将无法判断发出的请求是否成功。

http://www.w3.org/Protocols/rfc2616/rfc2616-sec10.html

   8 错误处理,状态码是4xx时,应返回错误信息,error当做key。

{
    error: "Invalid API key"
}

   9 返回结果,针对不同操作,服务器向用户返回的结果应该符合以下规范。

GET /collection:返回资源对象的列表(数组)
GET /collection/resource:返回单个资源对象
POST /collection:返回新生成的资源对象
PUT /collection/resource:返回完整的资源对象
PATCH /collection/resource:返回完整的资源对象
DELETE /collection/resource:返回一个空文档

   10 Hypermedia API,RESTful API最好做到Hypermedia,即返回结果中提供链接,连向其他API方法,使得用户不查文档,也知道下一步应该做什么。

{"link": {
  "rel":   "collection https://www.example.com/zoos",
  "href":  "https://api.example.com/zoos",
  "title": "List of zoos",
  "type":  "application/vnd.yourformat+json"
}}

   借鉴:http://www.ruanyifeng.com/blog/2014/05/restful_api.html

 四 restful的API面试解答

 问题:请说一下你对restful的认识。

 解答:

restful的API设计模式有API与用户的通信协议是基于HTTPs协议实现的,通过url传参的形式传递搜索条件的,还有错误处理等等。
在我没有遇到restful之前需要记住各种各样的很多的url路径,而且写的代码全是靠着试图函数给实现的,代码看起来不是很高端,并且等等
RESTful架构,是比较流行的一种互联网软件架构。REST,即Representational State Transfer的缩写。
说白点就是网站即软件,再白点就是一个服务软件支持http的四种方法:
GET用来获取资源,POST用来新建资源、更新资源,PUT用来更新资源,DELETE用来删除资源。

在我遇到restful之后,不需要记住那么多的url,可以将共同的方法封装到一个类下面,通过调用在这个类的方法来访问url。并且API很好的解决了跨域的问题。版本有更新的时候,还可以将版本号写在url中来提示使用的版本。还可以自己写访问错误时返回的错误信息。传入参数时还可以通过url来传递参数等等,

 

 借鉴 :

RESTful架构,目前是比较流行的一种互联网软件架构。REST,即Representational State Transfer的缩写。

说白点就是网站即软件,再白点就是一个服务软件支持http的四种方法:

     GET用来获取资源,POST用来新建资源、更新资源,PUT用来更新资源,DELETE用来删除资源。

     并对外提供一个或多个URI,每个URI对应一个资源;客户端通过URI配合上面的方法就可以和服务

段的软件交互。客户端主要是浏览器,使用restful框架的软件对http的支持也为了web应用带来方便。

     REST这个词,是Roy Thomas Fielding在他2000年的博士论文中提出的。他的贡献很多,

可以了解一下。本人工作的方向是SDN,也算是比较潮的东东,其中floodlight就用到了restful框架。

开发者为软件开发出一些功能,并提供URI api,用户就可以利用浏览器、curl等工具通过提供的URI

从软件中获得想要的信息或者设置软件的功能。

     对于发开者来说,就是提供URI和URI对应的资源,并将他们对应上,类似dicts={‘/path?‘:resource}。

比如重写http GET方法:首先获得客户端请求的url,解析url然后判断其对应的URI,由于URI与应一个资源,

那么url就可以访问这个资源了。具体实现上资源也就是方法或者一个类,要看具体实现了。

 

 

  

 

以上是关于django rest framemark的主要内容,如果未能解决你的问题,请参考以下文章

Django REST framework 基本组件

Django REST framework序列化

Django rest_framewok框架的基本组件

如何在 Django Summernote 中显示编程片段的代码块?

Spring Rest 文档。片段生成时 UTF-8 中间字节无效 [重复]

如何避免 Django Forms 和 Django Rest Framework Serializers 中的代码重复?