我们将创建一个简单的API,以允许管理员用户查看和编辑系统中的用户和组
Project setup
创建一个叫tutorial的新Django项目,然后启动一个名为quickstart的新应用程序。
# Create the project directory
mkdir tutorial
cd tutorial
# Create a virtualenv to isolate our package dependencies locally
virtualenv env
source env/bin/activate # On Windows use `env\Scripts\activate`
# Install Django and Django REST framework into the virtualenv
pip install django
pip install djangorestframework
# Set up a new project with a single application
django-admin.py startproject tutorial . # Note the trailing '.' character
cd tutorial
django-admin.py startapp quickstart
cd ..
现在第一次同步你的数据库:
python manage.py migrate
随后,我们还将创建一个名为admin的初始用户,密码为password123。 我们稍后将在该示例中验证该用户。
python manage.py createsuperuser
一旦你创建了一个数据库,初始用户创建完成并准备好了一切,那么就打开应用程序的目录,我们将要开始编码了...
Serializers
首先我们要定义一些序列化程序。 创建一个名为tutorial / 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')
请注意,在这个例子中,我们使用超链接关系,HyperlinkedModelSerializer。 你还可以使用主键和各种其他关系,但超链接是很好的符合RESTful的设计。
Views
是的,我们最好再写一些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的类中,而不是写多个视图。
如果需要,我们当然可以容易地划分为独立的视图,但是使用viewsets可以使视图逻辑组织更良好、简洁。
URLs
好了,我们现在开始在tutorial/urls.py中写API 相关的URLs了。
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)
# Wire up our API using automatic URL routing.
# Additionally, we include login URLs for the browsable API.
urlpatterns = [
url(r'^', include(router.urls)),
url(r'^api-auth/', include('rest_framework.urls', namespace='rest_framework'))
]
因为我们使用的是viewsets 而不是views,所以我们可以简单地使用路由器类注册viewsets 来自动生成API的URL 配置。
再次说一下,如果我们需要对API URL进行更多的控制,我们可以简单地将其下拉到使用常规基于类的视图,并明确地编写URL 配置。
最后,使用可浏览的API讲包含默认的登录和注销视图。 当然,这是可选的,但如果你的API需要身份验证,并且您想要使用可浏览的API,那么它们很有用。
Settings
我们也会想要一些全局设置。 例如我们想分页,我们希望我们的API只能由管理员使用。 这个设置模块就在tutorial / settings.py中
INSTALLED_APPS = (
...
'rest_framework',
)
REST_FRAMEWORK = {
'DEFAULT_PERMISSION_CLASSES': [
'rest_framework.permissions.IsAdminUser',
],
'PAGE_SIZE': 10
}
好了,我们完成了。
Testing our 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": "admin@example.com",
"groups": [],
"url": "http://127.0.0.1:8000/users/1/",
"username": "admin"
},
{
"email": "tom@example.com",
"groups": [ ],
"url": "http://127.0.0.1:8000/users/2/",
"username": "tom"
}
]
}
或使用httpie,命令行工具...
bash: http -a admin:password123 http://127.0.0.1:8000/users/
HTTP/1.1 200 OK
...
{
"count": 2,
"next": null,
"previous": null,
"results": [
{
"email": "admin@example.com",
"groups": [],
"url": "http://localhost:8000/users/1/",
"username": "paul"
},
{
"email": "tom@example.com",
"groups": [ ],
"url": "http://127.0.0.1:8000/users/2/",
"username": "tom"
}
]
}
或直接通过浏览器,跳转到URL http://127.0.0.1:8000 / users / ...
image.png如果您正在使用浏览器,请确保使用右上角的控件进行登录。
太好了,那很简单!
如果你想更深入地了解REST框架,请阅读the tutorial 或者 API guide。
网友评论