8 REST Framework 实现Web API 1

1 参考博客:

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

    

2  准备工作

1. 环境

Python: Python 3.5
Django: 1.9
django-filter: 0.11.0
djangorestframework: 3.3.1

 2.准备工作

安装库

pip install django
pip install djangorestframework
pip install django-filter 

创建工程 app
django-admin startproject django_rest_framework_test
cd django_rest_framework_test/

python manage.py startapp blog

 3.定义Model

from django.db import models
class User(models.Model):
    name = models.CharField(max_length=32)
    mail = models.EmailField()

  .admin注册

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

   4. 构建DB

# 添加程序 blog
INSTALLED_APPS = [
    ‘django.contrib.admin‘,
    ‘django.contrib.auth‘,
    ‘django.contrib.contenttypes‘,
    ‘django.contrib.sessions‘,
    ‘django.contrib.messages‘,
    ‘django.contrib.staticfiles‘,
    ‘blog‘,
]

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

python manage.py makemigrations
python manage.py migrate

  6.admi后台

# 创建管理用户
python manage.py createsuperuser
   Username (leave blank to use ‘kimihiro_n‘): dev
   Email address:
   Password:
   Password (again):
   Superuser created successfully.

# 启动服务器
python manage.py runserver

    

3  使用Djagno REST Framework

  1.添加APP REST Framework

#django_rest_framework_test/settings.py

INSTALLED_APPS = (
    ...
    ‘blog‘,
    ‘rest_framework‘,
)

  2.生成REST

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

  • - Serializer
  • - ViewSet
  • - URL pattern

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

  2.1定义Serialzier

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

#blog/serializer.py

# coding: utf-8
from rest_framework import serializers
from .models import User, Entry

class UserSerializer(serializers.ModelSerializer):
    class Meta:
        model = User
        fields = (‘name‘, ‘mail‘)

    

   2.2定义ViewSet

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

#blog/views.py

# coding: utf-8

import django_filters
from rest_framework import viewsets, filters

from .models import User, Entry
from .serializer import UserSerializer, EntrySerializer

class UserViewSet(viewsets.ModelViewSet):
    queryset = User.objects.all()
    serializer_class = UserSerializer

2.3定义URL pattern

#django_rest_framework_test/urls.py

# coding: utf-8

from django.conf.urls import url, include
from django.contrib import admin

from blog.urls import router as blog_router

urlpatterns = [
    url(r‘^admin/‘, admin.site.urls),
    #include blog.urls
    url(r‘^api/‘, include(blog_router.urls)),
]
#blog/urls.py

# coding: utf-8

from rest_framework import routers
from .views import UserViewSet, EntryViewSet

router = routers.DefaultRouter()
router.register(r‘users‘, UserViewSet)
router.register(r‘entries‘, EntryViewSet)

4测试API

python manage.py runserver

5. 未完成

自定义API

真正运用的时候,可能需要对抽选进行过滤。另外比如

将关系表数据同时获取

例如下面的数据

{
   "title": "Hello, Django REST API!!",
   "body": "<script>alert(\"hello\");</script>",
   "created_at": "2015-12-09T05:59:46.200277Z",
   "status": "draft",
   "author": 1
}
1
2
3
4
5
6
7
返回的是author的ID。如果这样下次还要通过 /api/users/1再次请求User的数据。这样效率并不好,现在我们想获得下面的数据。

{
   "title": "Hello, Django REST API!!",
   "body": "<script>alert(\"hello\");</script>",
   "created_at": "2015-12-09T05:59:46.200277Z",
   "status": "draft",
   "author": {
       "name": "Alice",
       "mail": "[email protected]"
   }
}
1
2
3
4
5
6
7
8
9
10
在Serializer里把author的部分,再次定义一下。

blog/serializer.py
…
class EntrySerializer(serializers.ModelSerializer):
    # author的serializer
    author = UserSerializer()

    class Meta:
        model = Entry
        fields = (‘title‘, ‘body‘, ‘created_at‘, ‘status‘, ‘author‘)
1
2
3
4
5
6
7
8
9
EntrySerializer 重新定义author,这样获取的时候会同时获得User信息。
其他的自定义方法请参照 http://www.django-rest-framework.org/api-guide/serializers/

分页

现在获取数据都是全件获取,数据量非常大的时候,需要对数量进行限制。

django_rest_framework_test/settings.py
REST_FRAMEWORK = {
    ‘DEFAULT_PAGINATION_CLASS‘: ‘rest_framework.pagination.LimitOffsetPagination‘,
    ‘PAGE_SIZE‘: 2
}
1
2
3
4
5
设置需要全局设置。在配置文件里,定义REST_FRAMEWORK,设置DEFAULT_PAGINATION_CLASS和PAGE_SIZE。
这样API会出现offset(开始位置)和limit(限制件数,
default=PAGE_SIZE)等参数。

{
    "count": 4,
    "next": "http://localhost:8000/api/entries/?limit=2&offset=2",
    "previous": null,
    "results": [
        {
            "id": 1,
            "title": "Hello, Django REST Framework!!",
            "body": "Hello!",
            "created_at": "2015-12-12T11:55:22.310203Z",
            "status": "draft",
            "author": 1
        },
        {
            "id": 2,
            "title": "The Zen of Python",
            "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!",
            "created_at": "2015-12-12T11:56:32.854278Z",
            "status": "draft",
            "author": 2
        }
    ]
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
next,previous都会带有URL,非常的方便。
其他方式,参照 http://www.django-rest-framework.org/api-guide/pagination/

筛选

如果想通过author来筛选Entry时。

django_rest_framework_test/settings.py
REST_FRAMEWORK = {
    ‘DEFAULT_FILTER_BACKENDS‘: (‘rest_framework.filters.DjangoFilterBackend‘,)
}
1
2
3
4
在配置文件里添加DEFAULT_FILTER_BACKENDS。和分页所设置的是同一个字典。

class EntryViewSet(viewsets.ModelViewSet):
    queryset = Entry.objects.all()
    serializer_class = EntrySerializer
    filter_fields = (‘author‘, ‘status‘)
1
2
3
4
然后在ViewSet里设置filter_fields。这样就可以通过author和status来筛选。
API后面为?author=1,就会抽选User id=1的blog。?status=public会抽选已经公开的Blog
其他筛选方法参照 http://www.django-rest-framework.org/api-guide/filtering/

参考URL

http://qiita.com/kimihiro_n/items/86e0a9e619720e57ecd8
http://www.django-rest-framework.org/
http://www.slideshare.net/unsolublesugar/res-tful
http://qiita.com/KojiOhki/items/5be98eeae72dca2260bc
http://racchai.hatenablog.com/entry/2016/04/12/Django_REST_framework_%E8%B6%85%E5%85%A5%E9%96%80

原文地址:https://www.cnblogs.com/venicid/p/8228220.html

时间: 2024-10-31 07:27:31

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

开始 ASP.NET Web API 2 之旅

HTTP不仅仅是提供网页而已.它同时也是一个用于公开服务和数据的强大的API平台.HTTP简单.灵活,而且无处不在.你能想到的几乎所有的平台,都会有一个HTTP库,因此HTTP服务可以达到广泛的客户端,包括浏览器.移动设备,和传统的桌面应用程序. ASP.NET Web API是一个用于构建基于.NET Framework 的 Web API 的框架.在本教程中,你将会使用ASP.NET Web API来创建返回一个产品列表的web API. 教程中使用的软件有: Visual Studio 2

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

9-3. 找出Web API中发生了什么变化 问题 想通过基于REST的Web API服务对数据库进行插入,删除和修改对象图,而不必为每个实体类编写单独的更新方法. 此外, 用EF6的Code Frist实现数据访问管理. 本例,我们模拟一个N层场景,用单独的客户端(控制台应用)来调用单独的基于REST服务的Web网站(WEB API应用) . 注意:每层使用单独的Visual Studio 解决方案, 这样更方便配置.调试和模拟一个N层应用. 假设有一个如Figure 9-3所示的旅行社和预订

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

9-4. Web API 的客户端实现修改跟踪 问题 我们想通过客户端更新实体类,调用基于REST的Web API 服务实现把一个对象图的插入.删除和修改等数据库操作.此外, 我们想通过EF6的Code First方式实现对数据的访问. 本例,我们模拟一个N层场景,用单独的控制台应用程序作为客户端,调用Web API服务(web api项目). 注:每个层用一个单独的解决方案,这样有助于调试和模拟N层应用. 解决方案 假设我们一个如Figure 9-4.所示模型 Figure 9-4. A 客户

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

第九章 在N层结构的应用程序中使用EF 不是所有的应用都能完全地写入到一个单个的过程中(就是驻留在一个单一的物理层中),实际上,在当今不断发展的网络世界,大量的应用程序的结构包含经典的表现层,应用程,和数据层,并且它们可能分布在多台计算机上,被分布到一台单独的计算机上的应用程序的某个领域的逻辑层,并不过多地涉及代理服务器编码,序列化,和网络协议,应用程序可以跨越很多设备,从小到一个移动设备到大到一个包含企业所有账户信息的数据服务器. 幸运的是,EF可应用于WCF,WEB Api等诸如此类的多层框

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 Oracle.ManagedDataAccess 4.121.1.0 library over a Web Api 2.2 OData v4 Endpoint. Looking through the Oracle documentation, Oracle Managed Data Access

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

概述:  ASP.NET Web API 的好用使用过的都知道,没有复杂的配置文件,一个简单的ApiController加上需要的Action就能工作.调用API过程中参数的传递是必须的,本节就来谈谈API使用过程中参数的传递方式. 各种参数传递方式的实现: ASP.NET Web API参数有两种传递方式,一种是请求时携带QueryString,对应API 开发中的FromUrlAttribute属性,也是参数传递默认属性,并且每个API可以含有多个此类型的参数,主要应对GET请求,但此种方式

基于.Net Framework 4.0 Web API开发(4):ASP.NET Web APIs 基于令牌TOKEN验证的实现

概述:  ASP.NET Web API 的好用使用过的都知道,没有复杂的配置文件,一个简单的ApiController加上需要的Action就能工作.但是在使用API的时候总会遇到跨域请求的问题, 特别各种APP万花齐放的今天,对API使用者身份角色验证是不能避免的(完全开发的API不需要对使用者身份角色进行管控,可以绕过),这篇文章就来谈谈基于令牌TOKEN身份验证的实现. 问题: 对于Web API的选择性的开放,使用者无论使用AJAX,还是HttpClient对接,总要对使用者的身份角色

Web API 2 使用Entity Framework Part 1.

创建项目 打开Visual Studio,选择ASP.NET Web Application,项目名称BookService并点击OK. 选择Web API 模板 如果你想使用Azure App Service,可以勾选上,在本章节,不勾选并不影响最终结果. 我显示是把它勾选上了并点击ok 创建项目. 如果没有勾选刚才Azure的,可以跳过以下内容. 配置Azure(可选) 在你登录到Azure,Visual Studio提示您配置站点的web应用程序,输入一个名称,选择您的Azure订阅,并选

基于.Net Framework 4.0 Web API开发(5):ASP.NET Web APIs AJAX 跨域请求解决办法(CORS实现)

概述:  ASP.NET Web API 的好用使用过的都知道,没有复杂的配置文件,一个简单的ApiController加上需要的Action就能工作.但是在使用API的时候总会遇到跨域请求的问题,特别各种APP万花齐放的今天,API的跨域请求是不能避免的. 在默认情况下,为了防止CSRF跨站的伪造攻击(或者是 javascript的同源策略(Same-Origin Policy)),一个网页从另外一个域获取数据时就会收到限制.有一些方法可以突破这个限制,那就是大家熟知的JSONP, 当然这只是