返回目录
我们将创建允许所有管理员用户通过系统来检查和编辑用户与分组的简单API。
项目设置
新建名称为tutorial
的Django项目, 之后新建一个新的名为quickstart
的app。
创建项目目录
mkdir tutorial
cd tutorial
创建孤立的虚拟环境
virtualenv env
source env/bin/activate #在windows中使用 env\Scripts\activate
在虚拟环境中安装Django REST framework
pip install django
pip install djangorestframework
创建仅有一个应用的新项目
django-admin.py startproject tutorial . # 注意尾部的 ‘.’ 字符
cd tutorial
django-admin.py startapp quickstart
cd ..
项目目录看起来应该是这样:
$ tree
.
├── manage.py
└── tutorial
├── __init__.py
├── quickstart
│ ├── __init__.py
│ ├── admin.py
│ ├── apps.py
│ ├── migrations
│ │ └── __init__.py
│ ├── models.py
│ ├── tests.py
│ └── views.py
├── settings.py
├── urls.py
└── wsgi.py
在项目目录中创建应用可能看起来不太寻常。我们使用项目的命名空间来防止与外部模块的冲突(这个话题已经超出了快速开始的范围)。
现在开始第一次同步数据库:
python manage.py migrate
我们也需要创建一个名为nameadmin
的初始用户,密码为password123
, 我们将在我们的例子中验证该用户。
python manage.py createsuperuser —email [email protected] -username admin
一旦您已经设置好了数据库,并初始化了用户,并且做好了准备的话,打开应用的目录开始编码吧…
序列化器(Serializers)
首先我们需要定义一些序列化器,让我们在tutrial/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.HyperlinkedModelSerializer):
class Meta:
model = Group
fields = (‘url’, ‘name’)
注意我们在该例中利用HyperlinkModelSerializer
实现了超链接关联,您也可以使用主键关键或者其他的关联,但是使用超链接是符合RESTful的设计风格的。
视图(Views)
现在,我们最好开始写一些视图了,打开tutorial/quickstart/views.py
,开始打字吧。
from django.contrib.auth.models import User, Group
from rest_framework import viewsets
from tutorial.quickstart.serializers import UserSerializer, GroupSerializer
class UserViewSet(viewsets.ModelViewSet):
“””
API endpoint that allows users to be viewed or edited.
“””
queryset = User.objects.all().order_by(‘-date_joined’)
serializer_class = UserSerializer
class GroupViewSet(viewsets.ModelViewSet):
“””
API endpoint that allows groups to be viewed or edited.
“””
queryset = Group.objects.all()
serializer_class = GroupSerializer
我们把所有共通的行为分组到称作视图集(ViewSets)的类中,而不是写多个视图函数。
如果需要,我们可以很容易的将他分解成单独的视图,但是使用视图集将会使视图逻辑良好的组织起来, 而且看起来十分简洁。
URLs
好的, 先来我们开始在tutorial/urls.py
中将URL和API连接起来。
from django.conf.urls import url, include
from rest_framework import routers
from tutorial.quickstart import views
router = routers.DefaultRouter()
router.register(r’users’, views.UserViewSet)
router.register(r’groups’, views.GroupViewSet)
使用自动URL路由连接我们的API
此外,我们还包含可浏览API的登录URL
urlpatterns = [
url(r’^’, include(router.urls)),
url(r’^api-auth/‘, include(‘rest_framework.urls’, namespace=‘rest_framework’))
]
由于我们使用了视图集代替了视图,我们可以通过简单的将视图集注册到路由类来自动生成URL到API的配置。
如前面所说, 如果我们需要对API和URL更多的控制权,我们可以很简单地转换到常规的试图类,并明确指定URL的配置。
最后, 我们包含了默认的登录和退出视图用于浏览API, 这是可选的,但如果您的API需要身份验证,并且您想要使用可浏览的API时非常有用。
设置
在设置文件tutorial/settings.py
中, 将'rest_framework'
添加到INSTALLED_APPS
中。
INSTALLED_APPS = (
…
‘rest_framework’,
)
好了,大功告成!
测试我们的API
现在我们已经准备好测试我们的API了,让我们通过命令行启动服务。
python manage.py runserver
现在已经可以进入我们的API了,可以使用命令行中的工具,比如curl
:
bash: curl -H ‘Accept: application/json; indent=4’ -u admin:password123 http://127.0.0.1:8000/users/
{
“count”: 2,
“next”: null,
“previous”: null,
“results”: [
{
“email”: “[email protected]”,
“groups”: [],
“url”: “http://127.0.0.1:8000/users/1/“,
“username”: “admin”
},
{
“email”: “[email protected]”,
“groups”: [ ],
“url”: “http://127.0.0.1:8000/users/2/“,
“username”: “tom”
}
]
}
或者使用httpie
:
$ http -a admin:password123 http://127.0.0.1:8000/users/
HTTP/1.1 200 OK
…
{
“count”: 2,
“next”: null,
“previous”: null,
“results”: [
{
“email”: “[email protected]”,
“groups”: [],
“url”: “http://localhost:8000/users/1/“,
“username”: “Paul”
},
{
“email”: “[email protected]”,
“groups”: [ ],
“url”: “http://127.0.0.1:8000/users/2/“,
“username”: “tom”
}
]
}
或者直接通过浏览器浏览, 访问URL:http://127.0.0.1:8000/users/
如果您直接使用浏览器工作,确保您通过上方右侧的入口登录。
太棒了,非常简单吧!
如果您想对REST framework是如何协同工作的有进一步的了解,请移步到我们的教程,或者开始浏览API指南。
Documents : the tutorial
API指南: API guide
下一节: 教程1-序列化(Serialization)