背景
最近接触到用 Twisted 来写个 RPC 服务器,对高并发、性能和大量长连接时的稳定性方面有要求,所以应该在 Twisted 的基础上再造些轮子,最后考虑用 Twisted + gevent 来实现 「异步+协程」的部分。
关联性和超链接
之前我们的 api 都是用外键关联,然而实际上用超链接的方式更符合 RESTful 的思想。
所以在这一章中我们将要用超链接(代替外键的方式)来提高关联性。
为 api 提供根路径
由于要采用超链接的方式,而之前我们的 ‘movies’ / ‘directors’ / ‘users’ 虽然有了 endpoints ,但 api 本身却没有一个整体的根路径,所以我们使用 @api_view
装饰器来创建一个根路径。
在 douban/views.py
中添加如下代码:
验证与授权 目前来看,我们的 API 并没有权限上的限制(即任何人都可以编辑或删除我们的 Movies ),这不是我们想要的。所以我们需要在 API 上做些限制以确保:
Movies 与 Users 关联起来。 只有授权了的用户才能创建新的 Movies。 只有 Movies 的创建者才可以更新或删除它。 未授权的用户只能进行查看。 在 models 中增加以下信息 我们先把之前注释掉的
1 2 3 4 5 6 7 director = models.ForeignKey('celebrity', related_name='Movies') class celebrity(models.Model): name = models.CharField(max_length=100, blank=True, default='') age = models.IntegerField() gender = models.CharField(choices=GENDER_CHOICES, default='male', max_length=20) 关联导演类的注释解开,来看看多张表在生成的 api 里的关联性。
接着在 models.py 中的 Movies 类中加入以下代码来确定 Movies 的创建者:
1 owner = models.ForeignKey('auth.User', related_name='Movies') 最后 models.
基于类的视图 基于类的视图比先前基于函数的视图的可重用性更强,可以更多快好省地 ( DRY )地写出简洁的代码。
把 API 用基于类的视图的方式重写 编辑 douban/views.py 进行如下重写
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 #!/usr/bin/python # -*- coding: utf-8 -*- from douban.
请求与响应 请求对象 DRF 提供了一个 request 对象,它继承自 HttpRequest 并且提供了更丰富的对 request 的解析处理的方法。其中最核心的是 request 对象的 request.data 属性,它看起来和 Django 的request.POST 相似,但是在处理 Web API 上更强大些。
1 2 request.POST # Only handles form data. Only works for 'POST' method. request.data # Handles arbitrary data. Works for 'POST', 'PUT' and 'PATCH' methods. request.data 相比于 request.POST 能够处理 api 中的 「POST」、「PUT」、「PATCH」等请求。
返回对象 DRF 也提供了一个 response 对象,它能把未 render 的对象(数据)通过一定方式转化为正确的数据格式返回给客户端。
1 return Response(data) # Renders to content type as requested by the client.
序列化 环境搭建 首先我们先新建一个 restapi 项目并安装上 django-rest-framework (DRF) 环境
1 2 3 4 $ pip install djangorestframework $ python manage.py startnewproject restapi $ cd restapi $ python manage.py startnewapp douban 接着,我们需要在 setting.py 里的加入如下代码:
1 2 3 4 5 INSTALLED_APPS = ( ... 'rest_framework', 'douban', ) 建立模型 由于我炒鸡喜欢看电影,所以仿着 douban-API 来做个简易的豆瓣电影的 rest-api 。
所以我们就用这个「仿豆瓣电影 api 」来作为栗子开始教程吧!
编辑 douban/models.py 文件并加入以下代码:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 #!