【一切人皆可行】使用Django迅速创建API的步骤

首先

我觉得与Flask和FastAPI相比,Django的入门门槛稍高,初学者可能会遇到些许困难。但即便是对于这样的人,只要按部就班地跟着步骤走,也可以很容易地完成!为了传达这个意思,我写了一篇文章。希望能对您有所帮助。

实践

请安装必要的库。

$ pip install django
$ pip install djangorestframework

接下来,我们需要在桌面或其他任意位置创建一个名为“django-api-work”的工作文件夹,然后使用VScode打开这个文件夹。

移动到作业文件夹并执行以下命令。

$ cd django-api-work
$ django-admin startproject apiproject

当使用”django-admin startproject [PJ名]”命令创建项目时,会在本地出现项目并复制所需文件。

层次结构

.
└── apiproject
    ├── apiproject
    │   ├── __init__.py
    │   ├── asgi.py
    │   ├── settings.py
    │   ├── urls.py
    │   └── wsgi.py
    └── manage.py

2 directories, 6 files

接下来会创建一个应用程序,所以先转到项目中。

$ cd apiproject/

创建应用程序

$ python manage.py startapp apiapp

※ python manage.py startapp [App名]

※ 使用python manage.py startapp [App名]命令开始一个应用程序。


階層構造
.
├── apiapp
│   ├── __init__.py
│   ├── admin.py
│   ├── apps.py
│   ├── migrations
│   │   └── __init__.py
│   ├── models.py
│   ├── tests.py
│   └── views.py
├── apiproject
│   ├── __init__.py
│   ├── __pycache__
│   │   ├── __init__.cpython-38.pyc
│   │   └── settings.cpython-38.pyc
│   ├── asgi.py
│   ├── settings.py
│   ├── urls.py
│   └── wsgi.py
└── manage.py

尽管文件很多可能会让你感到混乱,但只需要逐个查看所需文件,就能理解,所以请不要担心!

请在apiproject/settings.py文件中的INSTALLED_APPS下面添加以下两行。

    • “apiapp” : 作成したアプリ

 

    “rest_framework” : API作成に使用するライブラリ追加
INSTALLED_APPS = [
    "django.contrib.admin",
    "django.contrib.auth",
    "django.contrib.contenttypes",
    "django.contrib.sessions",
    "django.contrib.messages",
    "django.contrib.staticfiles",
    "apiapp", #追加
    "rest_framework", #追加
]

下一步是建立模型

在 apiapp/models.py 和应用程序的 models.py 中进行编辑。我们将定义模型并从这里创建表格,然后将其映射到实际的数据库。模型的作用是定义表格。由于我打算创建一个管理设备信息的功能,我准备了像 “name”、”place”、”type” 这样的列。

from django.db import models

# Create your models here.
class Device(models.Model):
    name = models.CharField(max_length=256)
    place = models.CharField(max_length=256)
    type = models.CharField(max_length=256)

Django的优点是可以将创建的模型(表)识别并在管理页面上进行输入和数据添加。要实现这一点,只需在admin.py中新增一行代码即可。这样,admin文件就可以识别模型(Device)了。

from django.contrib import admin
from .models import Device
# Register your models here.
admin.site.register(Device) #追加

我們將進行將模型反映到數據庫的工作。如果我們不進行這項工作,即使查看數據庫,也不會有任何表。我們會進行以下兩項任務。

    • [1] makemigrations : マイグレーションファイルの作成

 

    [2] migrate : データベースへ反映
(venv) python manage.py makemigrations
Migrations for 'apiapp':
  apiapp/migrations/0001_initial.py
    - Create model Device
(venv) python manage.py migrate

在启动应用程序时创建一个必要的管理员用户,以进入管理员界面。只要能够输入用户名和密码就可以了。

(venv) python manage.py createsuperuser

启动开发服务器

(venv) python manage.py runserver

http://127.0.0.1:8000/にアクセス

スクリーンショット 2023-03-06 23.21.25.png

http://127.0.0.1:8000/adminにアクセス

スクリーンショット 2023-03-06 23.21.37.png
    管理画面
スクリーンショット 2023-03-06 23.21.51.png
    • 実際にデータベースに簡単にデータ追加できます

 

    入力したら「SAVE」
スクリーンショット 2023-03-06 23.22.10.png

以下是API的正式部分。为了在Django中实现API,我们将使用一个名为Django REST framework(DRF)的库。接下来要做的事情有以下三个方面。

    • [1] Serializer

データの入出力を扱い、モデルへの橋渡しをするクラス
APIの Request/Responseに特化したクラス
シリアライザの種類

serializers.Serializer
serializers.ModelSerializer (これが一番利用されている?)

JSON, XML など ↔︎ Django の model の変換をするクラス。
デフォルトで model のフィールドを読み込んでくれる
デフォルトで create() メソッドと update() メソッドが実装されている
Readonly なフィールド設定可能

serializers.ListSerializer

複数のモデルを扱う前提
通常 ListSerializer を直接使うことはない
ListSerializer の挙動をカスタマイズしたい場合にのみ使用

[2] View

DRFにおけるViewとは、ユーザーからのアクセス(リクエスト)に対して、どのAPIを使用するかを決定、処理を行って返却する役割
Viewの作成

Generic View (generics.XXXXX)

DRFがデフォルトで提供している汎用的なViewの総称
よく使う機能毎にViewを提供してくれているので、自分が実装したい機能に合わせて適切なViewを継承

CreateAPIView : POST : 登録
ListAPIView : GET : 一覧取得
RetrieveAPIView : GET : 単体取得
UpdateAPIView : PUT/PATCH : 更新
DestroyAPIView : DELETE : 削除

ViewSet (viewsets.ModelViewSet)

DRFからデフォルトで提供されているDBとのやりとりに特化したViewで、取得, 一覧, 登録, 更新, 削除を一括で実装
ViewSetを利用するメリットは複数機能を一括で実装してくれるのでコード記述量が減る
大体ViewSetsを使う例がでてくるので、サンプルにもこまらないのかなと

※ GenericView和ViewSets都很方便,但如果不使用数据库,就不能使用它们。在这种情况下,可以使用”APIView”或者”api_view”。APIView是”基于类的视图”,api_view是”基于函数的视图”。

    • [3] Router

urls.pyにルーティングルールを追加
DefaultRouter は Router のルート画面にアクセスしたときに API のリンク一覧を見せてくれる
Routerで登録できるのは、ViewSetだけ
DefaultRouterとSimpleRouterがあって、あまり機能的には変わらない
ジェネリックビューを使用している場合はDjangoと同様に、as_view()を使用してルーティングする

※仅提供一种中文翻译选项:请参考下面的文章。

 

apiapp/serializers.py(新)

from rest_framework import serializers
from .models import Device 

class DeviceSerializer(serializers.ModelSerializer):
    class Meta:
        model = Device 
        fields = '__all__'

我們將繼續編輯 apiapp/views.py。

    • POINT

serializerを読み込む

querysetとserializer_classの設定

from django.shortcuts import render
from rest_framework import viewsets
from .models import Device
from .serializers import DeviceSerializer


class DeviceAPIView(viewsets.ModelViewSet):
    queryset = Device.objects.all()
    serializer_class = DeviceSerializer

我們將編輯apiapp/urls.py文件並進行路由設定。

from django.urls import path
from rest_framework import routers
from .views import DeviceAPIView 

router = routers.DefaultRouter()
router.register(r'device', DeviceAPIView)

我们将编辑project侧的urls.py。

from django.contrib import admin
from django.urls import path, include
from apiapp.urls import router as device_router

urlpatterns = [
    path("admin/", admin.site.urls),
    path("device/", include(device_router.urls)),
]

※ path(相对URL, 绑定函数(类),页面名称)或 path(相对URL, include(绑定的urls.py))
※ include方法不是用于视图函数,而是用于将其与另一个urls.py文件进行绑定时使用的方法。

    • urls.pyは、URLとViewの紐付けが主な役割

 

    • urls.pyの書き方は、pathメソッドに正しい値を渡すこと

 

    path以外にも、includeやre_pathを覚えておくと便利

工作基本完成了,以下使用命令启动。

$ python manage.py runserver

只要访问http://127.0.0.1:8000/device/并显示以下屏幕,就可以了。

スクリーンショット 2023-03-07 10.06.04.png

結束

从快速创建API的角度来看,使用flask或fastapi确实更加方便。如果只是尝试一下,我会推荐使用它们。但是一旦熟悉了,它们并不是那么难,我相信初学者在使用过程中会越来越熟练,所以不要灰心,继续努力吧?

广告
将在 10 秒后关闭
bannerAds