1 参考博客:

http://blog.csdn.net/SVALBARDKSY/article/details/50548073

    

2  准备工作

1. 环境

  1. Python: Python 3.5
  2. Django: 1.9
  3. django-filter: 0.11.
  4. djangorestframework: 3.3.

 2.准备工作

  1. 安装库
  2.  
  3. pip install django
  4. pip install djangorestframework
  5. pip install django-filter
  6.  
  7. 创建工程 app
  8. django-admin startproject django_rest_framework_test
  9. cd django_rest_framework_test/
  10.  
  11. python manage.py startapp blog

 3.定义Model

  1. from django.db import models
  2. class User(models.Model):
  3. name = models.CharField(max_length=)
  4. mail = models.EmailField()

  .admin注册

  1. from django.contrib import admin
  2. from blog.models import User
  3. # Register your models here.
  4. admin.register(User)

   4. 构建DB

  1. # 添加程序 blog
  2. INSTALLED_APPS = [
  3. 'django.contrib.admin',
  4. 'django.contrib.auth',
  5. 'django.contrib.contenttypes',
  6. 'django.contrib.sessions',
  7. 'django.contrib.messages',
  8. 'django.contrib.staticfiles',
  9. 'blog',
  10. ]

  5.然后同步数据结构,默认使用Sqlite3.

  1. python manage.py makemigrations
  2. python manage.py migrate

  6.admi后台

  1. # 创建管理用户
  2. python manage.py createsuperuser
  3. Username (leave blank to use 'kimihiro_n'): dev
  4. Email address:
  5. Password:
  6. Password (again):
  7. Superuser created successfully.
  8.  
  9. # 启动服务器
  10. python manage.py runserver

    

3  使用Djagno REST Framework

  1.添加APP REST Framework

  1. #django_rest_framework_test/settings.py
  2.  
  3. INSTALLED_APPS = (
  4. ...
  5. 'blog',
  6. 'rest_framework',
  7. )

  2.生成REST

  生成REST API最少需要定义下面3个。

  • - Serializer
  • - ViewSet
  • - URL pattern

  简单来说,Serializer是将「Model序列化」,ViewSet是API的应答器,URL Pattern定义了URL的路由。

  2.1定义Serialzier

  需要继承serializers.ModelSerializer, fields为API想要得到的字段。

  1. #blog/serializer.py
  2.  
  3. # coding: utf-
  4. from rest_framework import serializers
  5. from .models import User, Entry
  6.  
  7. class UserSerializer(serializers.ModelSerializer):
  8. class Meta:
  9. model = User
  10. fields = ('name', 'mail')

    

   2.2定义ViewSet

  queryset设置为Model的queryset,serializer_class设置为刚才定义的serializer。

  1. #blog/views.py
  2.  
  3. # coding: utf-
  4.  
  5. import django_filters
  6. from rest_framework import viewsets, filters
  7.  
  8. from .models import User, Entry
  9. from .serializer import UserSerializer, EntrySerializer
  10.  
  11. class UserViewSet(viewsets.ModelViewSet):
  12. queryset = User.objects.all()
  13. serializer_class = UserSerializer

2.3定义URL pattern

  1. #django_rest_framework_test/urls.py
  2.  
  3. # coding: utf-
  4.  
  5. from django.conf.urls import url, include
  6. from django.contrib import admin
  7.  
  8. from blog.urls import router as blog_router
  9.  
  10. urlpatterns = [
  11. url(r'^admin/', admin.site.urls),
  12. #include blog.urls
  13. url(r'^api/', include(blog_router.urls)),
  14. ]
  1. #blog/urls.py
  2.  
  3. # coding: utf-
  4.  
  5. from rest_framework import routers
  6. from .views import UserViewSet, EntryViewSet
  7.  
  8. router = routers.DefaultRouter()
  9. router.register(r'users', UserViewSet)
  10. router.register(r'entries', EntryViewSet)

4测试API

  1. python manage.py runserver

5. 未完成

  1. 自定义API
  2.  
  3. 真正运用的时候,可能需要对抽选进行过滤。另外比如
  4.  
  5. 将关系表数据同时获取
  6.  
  7. 例如下面的数据
  8.  
  9. {
  10. "title": "Hello, Django REST API!!",
  11. "body": "<script>alert(\"hello\");</script>",
  12. "created_at": "2015-12-09T05:59:46.200277Z",
  13. "status": "draft",
  14. "author":
  15. }
  16.  
  17. 返回的是authorID。如果这样下次还要通过 /api/users/1再次请求User的数据。这样效率并不好,现在我们想获得下面的数据。
  18.  
  19. {
  20. "title": "Hello, Django REST API!!",
  21. "body": "<script>alert(\"hello\");</script>",
  22. "created_at": "2015-12-09T05:59:46.200277Z",
  23. "status": "draft",
  24. "author": {
  25. "name": "Alice",
  26. "mail": "alice@example.com"
  27. }
  28. }
  29.  
  30. Serializer里把author的部分,再次定义一下。
  31.  
  32. blog/serializer.py

  33. class EntrySerializer(serializers.ModelSerializer):
  34. # author的serializer
  35. author = UserSerializer()
  36.  
  37. class Meta:
  38. model = Entry
  39. fields = ('title', 'body', 'created_at', 'status', 'author')
  40.  
  41. EntrySerializer 重新定义author,这样获取的时候会同时获得User信息。
  42. 其他的自定义方法请参照 http://www.django-rest-framework.org/api-guide/serializers/
  43.  
  44. 分页
  45.  
  46. 现在获取数据都是全件获取,数据量非常大的时候,需要对数量进行限制。
  47.  
  48. django_rest_framework_test/settings.py
  49. REST_FRAMEWORK = {
  50. 'DEFAULT_PAGINATION_CLASS': 'rest_framework.pagination.LimitOffsetPagination',
  51. 'PAGE_SIZE':
  52. }
  53.  
  54. 设置需要全局设置。在配置文件里,定义REST_FRAMEWORK,设置DEFAULT_PAGINATION_CLASSPAGE_SIZE
  55. 这样API会出现offset(开始位置)和limit(限制件数,
  56. default=PAGE_SIZE)等参数。
  57.  
  58. {
  59. "count": ,
  60. "next": "http://localhost:8000/api/entries/?limit=2&offset=2",
  61. "previous": null,
  62. "results": [
  63. {
  64. "id": ,
  65. "title": "Hello, Django REST Framework!!",
  66. "body": "Hello!",
  67. "created_at": "2015-12-12T11:55:22.310203Z",
  68. "status": "draft",
  69. "author":
  70. },
  71. {
  72. "id": ,
  73. "title": "The Zen of Python",
  74. "body": "The Zen of Python, by Tim Peters\r\n\r\nBeautiful is better than ugly.\r\nExplicit is better than implicit.\r\nSimple is better than complex.\r\nComplex is better than complicated.\r\nFlat is better than nested.\r\nSparse is better than dense.\r\nReadability counts.\r\nSpecial cases aren't special enough to break the rules.\r\nAlthough practicality beats purity.\r\nErrors should never pass silently.\r\nUnless explicitly silenced.\r\nIn the face of ambiguity, refuse the temptation to guess.\r\nThere should be one-- and preferably only one --obvious way to do it.\r\nAlthough that way may not be obvious at first unless you're Dutch.\r\nNow is better than never.\r\nAlthough never is often better than *right* now.\r\nIf the implementation is hard to explain, it's a bad idea.\r\nIf the implementation is easy to explain, it may be a good idea.\r\nNamespaces are one honking great idea -- let's do more of those!",
  75. "created_at": "2015-12-12T11:56:32.854278Z",
  76. "status": "draft",
  77. "author":
  78. }
  79. ]
  80. }
  81.  
  82. next,previous都会带有URL,非常的方便。
  83. 其他方式,参照 http://www.django-rest-framework.org/api-guide/pagination/
  84.  
  85. 筛选
  86.  
  87. 如果想通过author来筛选Entry时。
  88.  
  89. django_rest_framework_test/settings.py
  90. REST_FRAMEWORK = {
  91. 'DEFAULT_FILTER_BACKENDS': ('rest_framework.filters.DjangoFilterBackend',)
  92. }
  93.  
  94. 在配置文件里添加DEFAULT_FILTER_BACKENDS。和分页所设置的是同一个字典。
  95.  
  96. class EntryViewSet(viewsets.ModelViewSet):
  97. queryset = Entry.objects.all()
  98. serializer_class = EntrySerializer
  99. filter_fields = ('author', 'status')
  100.  
  101. 然后在ViewSet里设置filter_fields。这样就可以通过authorstatus来筛选。
  102. API后面为?author=,就会抽选User id=1blog。?status=public会抽选已经公开的Blog
  103. 其他筛选方法参照 http://www.django-rest-framework.org/api-guide/filtering/
  104.  
  105. 参考URL
  106.  
  107. http://qiita.com/kimihiro_n/items/86e0a9e619720e57ecd8
  108. http://www.django-rest-framework.org/
  109. http://www.slideshare.net/unsolublesugar/res-tful
  110. http://qiita.com/KojiOhki/items/5be98eeae72dca2260bc
  111. http://racchai.hatenablog.com/entry/2016/04/12/Django_REST_framework_%E8%B6%85%E5%85%A5%E9%96%80

8 REST Framework 实现Web API 1的更多相关文章

  1. 【ASP.NET MVC 5】第27章 Web API与单页应用程序

    注:<精通ASP.NET MVC 3框架>受到了出版社和广大读者的充分肯定,这让本人深感欣慰.目前该书的第4版不日即将出版,现在又已开始第5版的翻译,这里先贴出该书的最后一章译稿,仅供大家 ...

  2. Entity Framework 6 Recipes 2nd Edition(9-1)译->用Web Api更新单独分离的实体

    第九章 在N层结构的应用程序中使用EF 不是所有的应用都能完全地写入到一个单个的过程中(就是驻留在一个单一的物理层中),实际上,在当今不断发展的网络世界,大量的应用程序的结构包含经典的表现层,应用程, ...

  3. Entity Framework 6 Recipes 2nd Edition(9-3)译->找出Web API中发生了什么变化

    9-3. 找出Web API中发生了什么变化 问题 想通过基于REST的Web API服务对数据库进行插入,删除和修改对象图,而不必为每个实体类编写单独的更新方法. 此外, 用EF6的Code Fri ...

  4. Entity Framework 6 Recipes 2nd Edition(9-4)译->Web API 的客户端实现修改跟踪

    9-4. Web API 的客户端实现修改跟踪 问题 我们想通过客户端更新实体类,调用基于REST的Web API 服务实现把一个对象图的插入.删除和修改等数据库操作.此外, 我们想通过EF6的Cod ...

  5. 基于.Net Framework 4.0 Web API开发(2):ASP.NET Web APIs 参数传递方式详解

    概述:  ASP.NET Web API 的好用使用过的都知道,没有复杂的配置文件,一个简单的ApiController加上需要的Action就能工作.调用API过程中参数的传递是必须的,本节就来谈谈 ...

  6. 如何使用ASP.NET Web API OData在Oracle中使用Entity Framework 6.x Code-First方式开发 OData V4 Service

    环境: Visual Studio 2013 + .Net Framework 4.5.2 1.新建项目 2.安装OData,ODP.NET 安装的包: 下面是部分代码: using System; ...

  7. Web Api 2, Oracle and Entity Framework

    Web Api 2, Oracle and Entity Framework I spent about two days trying to figure out how to expose the ...

  8. [转]How to Use Web API OData to Build an OData V4 Service without Entity Framework

    本文转自:http://www.odata.org/blog/how-to-use-web-api-odata-to-build-an-odata-v4-service-without-entity- ...

  9. 基于.Net Framework 4.0 Web API开发(3):ASP.NET Web APIs 异常的统一处理Attribute 和统一写Log 的Attribute的实现

    概述:  ASP.NET Web API 的好用使用过的都知道,没有复杂的配置文件,一个简单的ApiController加上需要的Action就能工作.但是项目,总有异常发生,本节就来谈谈API的异常 ...

随机推荐

  1. java中的递归思想及应用

    递归就是自己调自己,最需要注意的就是结束条件,否则可能就是死循环,导致内存溢出 public T a(Object x,Object y) { if(条件true) { a(x1,y1); } els ...

  2. kickstart2019 round_A B. Parcels

    思路: 利用了曼哈顿距离和切比雪夫距离之间的转化. 参考: https://blog.csdn.net/Dylan_Frank/article/details/88985444 https://www ...

  3. mysql数据库字段类型的选择原则

    原文链接:http://blog.csdn.net/u013412790/article/details/51615407 数据库类型的选择对数据库的性能影响很大 1 . 数据类型会影响存储空间的开销 ...

  4. 在ActionBar中,即便设置showAsAction="always",items仍然在overflow中显示的问题

    今天很是苦恼,明明设置了android:showAsAction="always",但是所有的items全部都显示在overflow中,然后在官网发现了答案. 如果你为了兼容 An ...

  5. spring boot 下 spring security 自定义登录配置与form-login属性详解

    package zhet.sprintBoot; import org.springframework.beans.factory.annotation.Autowired;import org.sp ...

  6. Python之HTML的解析(网页抓取一)

    http://blog.csdn.net/my2010sam/article/details/14526223 --------------------- 对html的解析是网页抓取的基础,分析抓取的 ...

  7. mybatis-映射器的CRUD

    设计步骤:model.mapper.dao.service.junit单元测试.log4j日志 项目和之前的一样在此只是创建了test和修改了mapper 1.修改映射 1.1修改接口 package ...

  8. 手机上如何远程控制Linux服务器?

    这里介绍3个手机软件,分别是JuiceSSH.Termius和Termux,这3个软件都可以实现远程控制Linux服务器(相当于手机SSH客户端),而且使用起来都非常方便,下面我简单介绍一下这3个软件 ...

  9. Mybatis-连接池与事务

    Mybatis 的连接池技术 Mybatis 将它自己的数据源分为三类: UNPOOLED 不使用连接池的数据源 POOLED 使用连接池的数据源 JNDI 使用 JNDI 实现的数据源 Mybati ...

  10. 2018.6.6 基于Oracle数据库的航天信息系统JDBC练习

    综合练习 一.语言和环境 A.实现语言 Java B.环境要求 JDK 6.0及其以上版本.MyEclipse7.5及其以上版本.Oracle11g.PL/SQL Developer 二.功能要求 开 ...