尝试完成【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数据进行格式化处理并在前端进行反映。