对于数据资源的API一般要实现增、删、改、查的动作请求。如获取应用项目的部署主机信息

请求方法 请求地址 后端操作
GET /projecthost 获取所有主机
GET /projecthost/ 获取id为pk的主机
POST /projecthost 新增主机
PUT /projecthost/ 修改主机为pk主机
DELETE /projecthost/ 删除id为pk的主机

1、创建Django项目

1.1、创建drfdemo项目

  1. $ cd ~/project
  2. $ django-admin startproject drfdemo

1.2、创建apps应用

$ cd drfdemo
$ python mananger.py startapp apps

1.3、注册apps到项目settings.py中

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

2、原生方法实现增删改查API

Django创建API分为如下几个步骤:

  • 创建模型Model
  • 迁移模型至数据库
  • 创建视图View
  • 创建路由URL

    2.1、创建模型

    ```python from django.db import models

class ProjectHost(models.Model): “”” 主机信息模型 “”” ip = models.GenericIPAddressField(verbose_name=’主机IP’), project_name = models.CharField(max_length=64, verbose_name=’项目名称’), host_user = models.CharField(max_length=32, verbose_name=’主机用户’), number = models.IntegerField(default=1001, verbose_name=’主机编号’), status = models.BooleanField(default=True, verbose_name=’主机状态’) description = models.TextField(verbose_name=’描述’)

class Meta:
    db_table = 'app_hosts',
    verbose_name = '主机信息表'
    verbose_name_plural = verbose_name

    # verbose_name: 在admin管理界面中显示中文时的名称,表示单数显示
    # verbose_name_plural:表示中文复数显示
<a name="qNZJv"></a>
#### 2.2、迁移模型至数据库
```bash
$ python manage.py makemigrations  # 生成迁移文件
$ python manage.py migrate   # 执行数据库迁移

2.3、创建添加主机视图

一个基本的数据操作视图需要三个步骤:

  • 接收客户端提交的数据
  • 操作数据库,将数据入库
  • 返回客户端结果 ```python from django.http.response import JsonResponse from django.views import View from apps.models import ProjectHost

class ProjectHostView(View): “”” 主机管理API接口 “”” def post(self, request): “””添加主机”””

    # 1、接收客户端提交的数据
    ip = request.POST.get('ip')
    project_name = request.POST.get('project_name')
    host_user = request.POST.get('host_user')
    number = request.POST.get('number')
    status = request.POST.get('status')
    description = request.POST.get('description')

    # 2、操作数据库,将数据入库
    instance = ProjectHost.objects.create(
        ip=ip,
        project_name=project_name,
        host_user=host_user,
        number=number,
        status=status,
        description=description
    )

    # 3、返回结果
    return JsonResponse(data={
        "ip": instance.ip,
        "project_name": instance.project_name,
        "host_user": instance.host_user,
        "number": instance.number,
        "status": instance.status,
        "description": instance.description
    }, status=200)
<a name="mouGE"></a>
#### 2.4、创建路由
Django路由包含项目入口路由及应用路由,分别在项目目录和应用目录下

- 项目路由中引入应用路由drfdemo/urls.py
```python
from django.contrib import admin
from django.urls import path, include

urlpatterns = [
    path('admin/', admin.site.urls),
    path('api/', include("apps.urls")),  # 新增
]
  • 应用路由下创建urs.py,添加视图路由 ```python from django.urls import path from apps.views import ProjectHostView # 引入视图方法

urlpatterns = [ path(‘projecthost/‘, ProjectHostView.as_view()), # 添加视图路由 ]

<a name="Mv6gq"></a>
#### 2.5、postman验证![image.png](https://cdn.nlark.com/yuque/0/2022/png/12377978/1645342383454-0bf32c2c-693e-4a3b-85bc-cddd10468798.png#clientId=u2abc6bd0-3e0e-4&crop=0&crop=0&crop=1&crop=1&from=paste&height=569&id=u25293fbb&margin=%5Bobject%20Object%5D&name=image.png&originHeight=569&originWidth=873&originalType=binary&ratio=1&rotation=0&showTitle=false&size=57257&status=done&style=none&taskId=u9b047993-7295-42f6-99d4-243d5f9eb92&title=&width=873)
<a name="sH4cI"></a>
#### 2.6、查询、修改和删除API实现
按照上述方法,依次实现查询、修改和删除方法
```python
    def get(self, request):
        """查询主机接口"""
        # 1、查询数据库数据
        instance = list(ProjectHost.objects.values())

        # 2、返回结果
        return JsonResponse(data=instance, status=200, safe=False)

    def put(self, request, pk):
        """修改主机接口"""
        # 1、接收客户端提交的数据
        request_data = json.loads(request.body)
        ip = request_data.get('ip')
        project_name = request_data.get('project_name')
        host_user = request_data.get('host_user')
        number = request_data.get('number')
        status = request_data.get('status')
        description = request_data.get('description')

        # 2、操作数据库,将数据入库
        try:
            instance = ProjectHost.objects.get(pk=pk)
            instance.ip = ip
            instance.project_name = project_name
            instance.host_user = host_user
            instance.number = number
            instance.status = status
            instance.description = description
            instance.save()
        except ProjectHost.DoesNotExist:
            return JsonResponse(data={}, status=404)

        # 3、返回结果
        return JsonResponse(data={
            "ip": instance.ip,
            "project_name": instance.project_name,
            "host_user": instance.host_user,
            "number": instance.number,
            "status": instance.status,
            "description": instance.description
        }, status=201)

    def delete(self, request, pk):
        """删除一条主机数据"""
        # 1、数据库获取查询数据
        try:
            instance = ProjectHost.objects.get(pk=pk)
            instance.delete()
        except ProjectHost.DoesNotExist:
            return JsonResponse(data=None, status=404)

        # 2、返回结果
        return JsonResponse(data={}, status=201)

更新一条操作需要传入数据id,因此需要单独创建路由

from django.urls import path, re_path
from apps.views import ProjectHostView

urlpatterns = [
    path('projecthost/', ProjectHostView.as_view()),
    re_path('projecthost/(?P<pk>\d+)', ProjectHostView.as_view()),  # 增加处理修改数据路由
]