- 自动生成符合 RESTful 规范的 API
- 支持 OPTION、HEAD、POST、GET、PATCH、PUT、DELETE
- 根据
Content-Type
来动态的返回数据类型(如 text、json)
- 生成 browserable 的交互页面(自动为 API 生成非常友好的浏览器页面)
- 非常细粒度的权限管理(可以细粒度到 field 级别)
示意图
安装
$ pip install djangorestframework $ pip install markdown
概述
Django Rest framework 的流程大概是这样的
- 建立 Models
- 依靠 Serialiers 将数据库取出的数据 Parse 为 API 的数据(可用于返回给客户端,也可用于浏览器显示)
- ViewSet 是一个 views 的集合,根据客户端的请求(GET、POST等),返回 Serialiers 处理的数据
- 权限 Premissions 也在这一步做处理
- ViewSet 可在 Routers 进行注册,注册后会显示在 Api Root 页上
- 在 urls 里注册 ViewSet 生成的 view,指定监听的 url
希望全面细致了解的人请移步去看官方文档,我这里就不一步步的细说了,而是分块来进行介绍
准备工作 & Models
让我们来写个小项目练练手
- 先用
manage.py startproject rest
来生成一个项目 - 再用
manage.py createsuperuser
创建用户(后面权限管理会用到) - 初始化数据库
manage.py migrate
然后当然是编写 models,为了展示 rest_framework 的强大之处,我给 models 定义了一个自定义的 field
# myproject/myapp/models.py
#! /usr/bin/env python
# -*- coding: utf-8 from __future__ import unicode_literals, absolute_import import cPickle as pickle from django.db import models from django.contrib.auth.models import User class SerializedField(models.TextField): """序列化域 用 pickle 来实现存储 Python 对象 """ __metaclass__ = models.SubfieldBase # 必须指定该 metaclass 才能使用 to_python def validate(self, val): raise isinstance(val, basestring) def to_python(self, val): """从数据库中取出字符串,解析为 python 对象""" if val and isinstance(val, unicode): return pickle.loads(val.encode('utf-8')) return val def get_prep_value(self, val): """将 python object 存入数据库""" return pickle.dumps(val) class MyModel(models.Model): created_at = models.DateTimeField(auto_now_add=True) # 注意这里建立了一个外键 owner = models.ForeignKey(User, related_name='mymodels') field = models.CharField(max_length=100) options = SerializedField(