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 类