尝试完成【Django】DjangoRESTFramework的教程:快速入门倾向

Django REST Framework 的快速入门

只需按照正式教程进行,不需要任何花招。

项目的创建

# ディレクトリ作成
$ mkdir drf && cd drf

# 仮想環境作成
$ python -m venv drf
$ source drf/bin/activate

# django , django rest framework をインストール
$ pip install --upgrade pip
$ pip install django
$ pip install djangorestframework

# プロジェクト、アプリを作成
$ django-admin startproject tutorial
$ cd tutorial
$ django-admin startapp quickstart

# migrate, スーパーユーザ作成
$ python manage.py migrate
$ python manage.py createsuperuser --email admin@example.com --username admin

当用户创建完成后,我们将开始编写代码。

编写API

序列化器

在快速启动应用程序中创建一个名为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']

说实话,我不太清楚什么是序列化器。
→ 现在只知道序列化器

此外,对于RESTful的API,好像使用超链接的数据关系较好。
有一种说法是在序列化器中创建超链接关系,但说实在的,我也不太明白它的意义,
所以暂时先遵循这个说法。

观察

以下是views.py的内容

from django.contrib.auth.models import User, Group
from rest_framework import viewsets
from rest_framework import permissions
from quickstart.serializers import UserSerializer, GroupSerializer

class UserViewSet(viewsets.ModelViewSet):
    queryset = User.objects.all().order_by('-date_joined')
    serializer_class = UserSerializer
    permission_classes = [permissions.IsAuthenticated]

class GroupViewSet(viewsets.ModelViewSet):
    queryset = Group.objects.all()
    serializer_class = GroupSerializer
    permission_classes = [permissions.IsAuthenticated]

ViewSet类是一个提供API端点给用户读写权限的模式。
利用ViewSet类可以将类似的功能汇总起来。
ViewSet类可以简单地分解成多个视图来写,但使用ViewSet可以很好地汇总功能。
我重申了重要的事情两次。
老实说,现阶段我完全不知道所谓的类似功能到底是什么意思。
总之,在这里指定的就是对于使用这个API的用户来说,各自需要如何处理读写权限的问题。

網址

听说可以通过使用ViewSet代替view,自动生成用于API的URL设置。只需将viewsets注册到router类中即可实现自动生成。

使用简单的视图时,有空间进行详细设置。

url.py 的内容如下:

from django.contrib import admin
from django.urls import path, 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 = [
    path('admin/', admin.site.urls),
    path('', include(router.urls)),
    path('api-auth/', include('rest_framework.urls', namespace='rest_framework')),
]

router = routers.DefaultRouter() : 假设我是在初始化路由器
router.register(~~) : 我想是在路由器上注册路由

/router/ : 参考 router 的 urls
/api-auth/ : 参考 rest_framework 的 urls

分页

似乎可以在settings.py文件中通过设置Pagination来指定每页可以控制多少个对象。

目前还不理解设置分页的意义。

# Pagination(setting.py 最下部に追記)
REST_FRAMEWORK = {
    'DEFAULT_PAGINATION_CLASS': 'rest_framework.pagination.PageNumberPagination',
    'PAGE_SIZE': 10
}

在Settings.py文件中添加rest_framework包

通过将rest_framework添加到INSTALLED_APP中,使其可用。

# Application definition

INSTALLED_APPS = [
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    'rest_framework',
]

确认API

既然到了这一步,应该可以启动应用程序,所以我们可以尝试对API进行测试。

$ python manage.py runserver

如果服务器成功启动,就再打开一个终端,然后执行以下指令:
※ 将[密码]替换为用户自行设置的密码

$ curl -H 'Accept: application/json; indent=4' -u admin:[password] http://127.0.0.1:8000/users/

{
    "count": 1,
    "next": null,
    "previous": null,
    "results": [
        {
            "url": "http://127.0.0.1:8000/users/1/",
            "username": "admin",
            "email": "admin@example.com",
            "groups": []
        }
    ]
}

收到了JSON数据!

    • ブラウザにアクセスでもOK

アドレスバーに/users/1 とか入力したらページ表示される
ログインしてないと403 forbiddenが表示されるが、右上にログインボタンがある

结束

使用Django REST Framework的功能,可以创建一个可以通过URL访问并返回以JSON形式保存在数据库中的模型数据的API。

接下来要做的是,如何使用React(Next.js)来实现对这个JSON数据进行格式化处理并在前端进行反映。

bannerAds