使用Django REST Framework来实现API

我是箕牧和广,在未来电子技术的实习生。这次我打算写关于Django REST Framework。

我是一个编程初学者,所以内容可能存在错误。
如果有错误,请指出并帮助我修正。

Django REST Framework是什么?

能够支持在Django中开发Web API的库。在库的标准支持下,可以开发出符合RESTful API的应用程序。

迅速安装

安装所需的库。
$ pip install django
$ pip install djangorestframework
$ pip install django-filter 
创建项目应用程序。
# django_rest_framework_testという名前でプロジェクトを作ってみます
$ django-admin startproject django_rest_framework_test
$ cd django_rest_framework_test/

$ python manage.py startapp blog

# ディレクトリ構造確認
.
└── django_rest_framework_test
    ├── blog
    │   ├── __init__.py
    │   ├── admin.py
    │   ├── apps.py
    │   ├── migrations
    │   ├── models.py
    │   ├── tests.py
    │   └── views.py
    ├── django_rest_framework_test
    │   ├── __init__.py
    │   ├── settings.py
    │   ├── urls.py
    │   └── wsgi.py
    └── manage.py
模型的定义 de
from django.db import models


class User(models.Model):
    name = models.CharField(max_length=32)
    mail = models.EmailField()


class Entry(models.Model):
    STATUS_DRAFT = "draft"
    STATUS_PUBLIC = "public"
    STATUS_SET = (
            (STATUS_DRAFT, "下書き"),
            (STATUS_PUBLIC, "公開中"),
    )
    title = models.CharField(max_length=128)
    body = models.TextField()
    created_at = models.DateTimeField(auto_now_add=True)
    updated_at = models.DateTimeField(auto_now=True)
    status = models.CharField(choices=STATUS_SET, default=STATUS_DRAFT, max_length=8)
    author = models.ForeignKey(User, related_name='entries', on_delete=models.CASCADE)

定义一个只包含姓名和电子邮件的用户(User),以及表示博客文章的条目(Entry)。使用外键(ForeignKey)在条目(Entry)中引用用户(User)以获取博客作者的信息。

数据库建设

# blogを追記
INSTALLED_APPS = [
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    'blog',
]
# migrationファイルを作る
$ python manage.py makemigrations
# migrationファイルを元にDBに反映する
$ python manage.py migrate

添加用户自定义模型。

from django.contrib import admin

from .models import User, Entry


@admin.register(User)
class UserAdmin(admin.ModelAdmin):
    pass

@admin.register(Entry)
class Entry(admin.ModelAdmin):
    pass
确认行动
# admin用のユーザー作成
$ python manage.py createsuperuser
    Username (leave blank to use 'kimihiro_n'): dev
    Email address:
    Password:
    Password (again):

# 開発サーバーを起動
$ python manage.py runserver

可以通过 http://localhost:8000/admin 进入Django的管理页面。
到此为止,常规的Django流程就结束了。

将Django REST Framework集成进来

加载REST框架
INSTALLED_APPS = (
    ...
    'blog',
    'rest_framework',
)
序列化器的定义
# coding: utf-8

from rest_framework import serializers

from .models import User, Entry


class UserSerializer(serializers.ModelSerializer):
    class Meta:
        model = User
        fields = ('name', 'mail')


class EntrySerializer(serializers.ModelSerializer):
    class Meta:
        model = Entry
        fields = ('title', 'body', 'created_at', 'status', 'author')

继承serializers.ModelSerializer以创建与模型对应的序列化器。在fields参数中以元组的形式提供要输出为API的字段名。列出的字段将以默认实现进行序列化和输出。

ViewSet的定义
# coding: utf-8

import django_filters
from rest_framework import viewsets, filters

from .models import User, Entry
from .serializer import UserSerializer, EntrySerializer


class UserViewSet(viewsets.ModelViewSet):
    queryset = User.objects.all()
    serializer_class = UserSerializer


class EntryViewSet(viewsets.ModelViewSet):
    queryset = Entry.objects.all()
    serializer_class = EntrySerializer

指定一个Django Model的查询集到queryset,指定之前定义的Serializer到serializer_class。你也可以预先对查询集进行筛选。

URL模式定义
# coding: utf-8

from django.conf.urls import url, include
from django.contrib import admin

from blog.urls import router as blog_router

urlpatterns = [
    url(r'^admin/', admin.site.urls),
    # blog.urlsをincludeする
    url(r'^api/', include(blog_router.urls)),
]
# coding: utf-8

from rest_framework import routers
from .views import UserViewSet, EntryViewSet


router = routers.DefaultRouter()
router.register(r'users', UserViewSet)
router.register(r'entries', EntryViewSet)

最后是URL模式的定义。使用名为router的工具,按照每个模型进行注册。
如果按照上述设置进行配置,则/api/将成为访问REST API的入口,GET /api/users/可获得用户列表,GET /api/entries/可访问条目列表。

确认API操作

现在可以运行REST API了。

python manage.py runserver

启动服务器,并访问http://localhost:8000/api/。

广告
将在 10 秒后关闭
bannerAds