REST是Representational State Transfer的简称  大致意思是  表现状态转移 ,个人理解为 数据展示格式 转换

rest api在web开发中的前后端分离开发比较受欢迎,例移动端 或桌面浏览器。也就是说这个url 不依赖于设备 也不依赖于软件环境,只要可以联网即可。这样REST服务可以解决各种各样的数据质量问题,因为rest服务复用性高,可提供给大量不同的应用。

rest风格的api是面向数据资源的。 这些数据资源都可以通过url来获取。可以充分利用HTTP/HTTPS协议的特点,比如HTTP方法,header信息,HATEOAS直接面向资源进行操作。

rest api 规范 :
1.在url上要表明这是一个api. 例 https://api.example.com , https://example.org/api/ 

2.路径:使用名词表示(可复数)  例 https://api.example.com/v1/zoos  , https://apid.example.com/v1/animals 

3.请求方式: GET:获取数据  POST:写入数据  PUT:覆盖原数据  PATCH:部分修改数据  DELETE:删除数据 

4.返回结果中应包含状态码,来表明请求状态

5.url与数据对应规范: GET/collection :返回资源对象列表 ,GET/collection/resource:返回单个资源对象 ,POST/collection :返回新建的资源对象

PUT/collection/resource :返回完整的资源对象 , PATCH/collection/resource:返回完整的资源对象 ,DELETE/collection/resource:返回一个空文档

 

 

Django 如下方式来实现自动实现queryset数据的序列化。

 

1 手动将django的orm查询出的对象转换成json

urls.py 
from coffeehouse.index's import views as stores_views
urlpatterns = [
url(r'^rest/$',stores_views.rest_store,name="rest_index"),
]

views.py

from django.http import HttpResponse

from indexs.models import CollectSite

import json

def rest_store(request):

  all_site=CollectSite.objects.all()
  all_site=[{"id":Site.id,"url":Site.siteurl,"name":Site.name,"comment":Site.comment,"class":Site.siteclass} for Site in all_site]
  return HttpResponse({'all_site':json.dumps(all_site)},content_type='application/json')

HttpResponse()设置了content_type,也就是在HTTP响应头中设置了Content-Type ,告诉请求方,返回的数据类型是JSON。避免了用户猜测如何使用一个rest服务提供的回复。另一个Content-Type的值application.xml 表示rest服务的返回数据格式是XML。不提供content_type则统一认为是JSON格式

 

2 使用django.core的serializers 

urls.py

urlpatterns = [
url(r'^rest/$',stores_views.rest_store,name="rest_index"),
url(r'^(?P<store_id>\d+)/rest/$',stores_views.rest_store,name="rest_detail"),#捕获url中内容以命名参数形式传给views的函数,同一个view函数用于两个url
]

views.py

from django.core import serializers

def rest_store(request,store_id=None):
  store_list=Item.objects.all()
  if store_id :
    store_list=store_list.filter(id=store_id) #这个filter()是对已查取的结果进行筛选

  if 'type' in request.GET and request.GET['type']=='xml':
    #serialize()可以按第一个参数的格式(‘xml’或‘json’)将第二个参数序列化成相应格式
    serialized_stores=serializers.serialize('xml',store_list)
    return HttpResponse(serialized_stores,content_type='application/xml')
  else:
    serialized_stores=serializers.serialize('json',store_list)
    return HttpResponse(serialized_stores,content_type='application/json')

如果提供的数据格式不符合HttpResponse的第二个参数,默认转化为json格式

 

3. 对查询的对象做更复杂的操作,功能更丰富,友好的rest api可使用django rest framework 

密集的rest api 认证机制,提供更稳定,持久的序列化功能,处理python中不可序列化对象的序列化问题

Django Tastypie Framework是django的第二大受欢迎的rest 框架。 

安装

django rest framework作为python的标准包,可以通过pip install djangorestframework

启用

在django创建的项目中的settings.py的INSTALLED_APPS中加上'rest_framework'

 

serializers 和views

核心模块serializers用于定义数据的表现形式,通常基于django的models. 一些不可序列化的python数据,如时间可表示为多种格式,或任何不确定的数据

在app目录下创建 serializers.py

from rset_framework import serializers 

class StoreSerializer(serializers.Serializer):

  name=serializers.CharField(max_length=200)

  email=serializers.EmailField()

 serializers是一个标准的python类,这个类继承自serializers.Serializer类,这个结构同django model类和django form 类 

 posted on 2018-09-20 18:31  庭明  阅读(96)  评论(0编辑  收藏  举报