Django REST framework 框架
http://www.django-rest-framework.org/ 官网
安装djangorestframework
pip install djangorestframework
pip install markdown # Markdown 可浏览API的标记支持
pip install django-filter # 支持过滤
pip install coreapi
或者安装 git clone git@github.com:encode/django-rest-framework.git
settings.py
ALLOWED_HOSTS = ['10.8.152.31']
INSTALLED_APPS = (
...
'rest_framework',
'app',
'book',
)
urls.py
urlpatterns = [
...
url(r'^api-auth/', include('rest_framework.urls'))
]
用restful可以很快做一个API接口
在book app中创建一个文件serializers.py 序列化就是把查询的结果转变成json格式
book/serializers.py
#导入序列化的类
from rest_framework import serializers
#导入模型
from book.models import BookCategory,Book
# 二级分类的序列化
class CategorySerializer2(serializers.ModelSerializer):
class Meta:
# 指定要序列化的模型
model = BookCategory
# 指定要序列化的字段 "__all__"表示所有字段
fields = "__all__"
# 一级分类的序列化
class CategorySerializer(serializers.ModelSerializer):
# sub_category 是models.py中 BookCategory.parent_category中related_name的值
#关联二级分类 使用CategorySerializer2 多对一的关系用many=True
sub_category = CategorySerializer2(many=True)
class Meta:
model = BookCategory
fields = "__all__"
#把模型的字段一一映射起来 序列化的结果集转化成json字符串
book/views.py
# Create your views here.
from django.shortcuts import render
#导入rest_framework封装好的视图
from rest_framework import mixins,viewsets
from book.models import BookCategory
from book.serializers import CategorySerializer
class CategoryViewSet(mixins.ListModelMixin,mixins.RetrieveModelMixin,viewsets.GenericViewSet):
"""所有图书分类"""
#queryset 根据类型查询一级分类结果集
queryset = BookCategory.objects.filter(category_type = 1)
serializer_class = CategorySerializer
RESTfulDemo/urls.py
from django.conf.urls import url,include
from django.contrib import admin
#导入rest_framework的默认路由
from rest_framework.routers import DefaultRouter
#导入视图
from book.views import CategoryViewSet
#导入API接口文档
from rest_framework.documentation import include_docs_urls
#配置Category的url 路由
router = DefaultRouter()
#注册路由 相当于二级路由
router.register(r'categorys',CategoryViewSet,base_name='categorys')
#会自动生成url
# ^ ^categorys/$ [name='categorys-list']
# ^ ^categorys\.(?P<format>[a-z0-9]+)/?$ [name='categorys-list']
# ^ ^categorys/(?P<pk>[^/.]+)/$ [name='categorys-detail']
# ^ ^categorys/(?P<pk>[^/.]+)\.(?P<format>[a-z0-9]+)/?$ [name='categorys-detail']
urlpatterns = [
url(r'^admin/', admin.site.urls),
url(r'^',include('app.urls')),
url(r'^',include(router.urls)), #添加到一级路由
url(r'^docs/',include_docs_urls(title="学习图书"))
]
测试 http://10.8.152.31:8888/docs/
官网的实例
请求工具
curl
httpie安装
windeows下安装
$ pip install --upgrade pip setuptools
$ pip install --upgrade httpie
Linux 安装
# Debian, Ubuntu, etc.
$ apt-get install httpie
发get请求
$ http httpie.org
发put请求
Custom HTTP method, HTTP headers and JSON data:
$ http PUT example.org X-API-Token:123 name=John
# 创建项目目录
mkdir tutorial
cd tutorial
# 创建虚拟环境,并进入虚拟环境中
virtualenv env
source env/bin/activate
# 安装django 和 REST framework
pip install django
pip install djangorestframework
# 创建项目和app
django-admin.py startproject tutorial
cd tutorial
django-admin.py startapp quickstart
cd ..
创建数据库:
python manage.py migrate
创建一个超级用户admin,密码是password123。我们将会在接下来的例子中使用这个账户。
python manage.py createsuperuser
创建一个新的模块叫 tutorual/quickstart/serializers.py
from django.contrib.auth.models import User, Group
from rest_framework import serializers
class UserSerializer(serializers.HyperlinkedModelSerializer):
class Meta:
model = User
fields = ('url','username','email','groups')
class GroupSerializer(serializers.HyperlinkModelSerializer):
class Meta:
model = Group
fields = ('url','name')
这里我们使用 hyperlinked(HyperlinkedModelSerializer)。你也可以使用primary key和各式各样其他的关系。但是 hyperlinking是一个好的RESTful设计。
tutorial/quickstart/views.py
from django.contrib.auth.models import User, Group
from rest_framework import viewsets
from quickstart.serializers import UserSerializer, GroupSerializer
class UserViewSet(viewsets.ModelViewSet):
"""
API允许查看和编辑 用户
"""
queryset = User.object.all().order_by('-data_joined')
serializer_class = UserSerializer
class GroupViewSet(viewsets.ModelViewSet):
"""
API允许查看和编辑 组
"""
queryset = Group.objects.all()
serializer_class = GroupSerializer
将有共同行为的各式各样的View归为一类并称之为 ViewSets
tutorual/urls.py
from django.contrib import admin
from django.conf.urls import url, include
from rest_framework import routers
from quickstart import views
router = routers.DefaultRouter()
router.register(r'users', views.UserViewSet)
router.register(r'groups', views.GroupViewSet)
urlpatterns = [
url(r'^', include(router.urls)),
url(r'^api-auth/', include('rest_framework.urls', namespace='rest_framework'))
]
因为我们使用了viewsets来替代views,我们能够自动产生我们API的URL,只要在router中简单的注册一下我们的viewsets。
同样,如果我们需要更多的控制我们的API URLs,我们能够在简单的在下面使用常规的 class-based views,并写入url conf中。
最后,我们使用 browsable API来导入默认的登录登出Views.这是可选的。
tutorial/settings.py
INSTALLED_APPS = (
...
'rest_framework',
)
REST_FRAMEWORK = {
'DEFAULT_PERMISSION_CLASSES': [
'rest_framework.permissions.IsAdminUser',
],
'PAGE_SIZE': 10
}
https://segmentfault.com
测试 http://10.8.152.31:8888/