zoukankan      html  css  js  c++  java
  • django rest framework

    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 类 

  • 相关阅读:
    Java代码检测工具
    java编程工具
    100-days: The one day
    前端书籍整理
    vue 学习笔记(二)
    从零开始写一个npm包及上传
    Vue Baidu Map 插件的使用
    对数组对象进行过滤
    使用css方法使footer保持在页面的最底部
    判断是第一次打开界面?还是刷新
  • 原文地址:https://www.cnblogs.com/Ting-light/p/9682583.html
Copyright © 2011-2022 走看看