geekdoc-python-zh/docs/askpython/django-rest-api.md

14 KiB
Raw Permalink Blame History

django REST API——从基础到实现

原文:https://www.askpython.com/django/django-rest-api

在本文中,我们将了解 API、Django REST APIs、HTTP 方法,最后,创建我们自己的第一个 REST API 应用程序。

什么是 API

API 是应用程序编程接口的缩写,它允许您与其他应用程序交互,并在需要时拉/处理/推数据和值。

简单来说,在 API 中,我们从客户端接收一些数据作为请求,对其进行处理,然后向客户端发回一些数据。

例如:脸书搜索,这里的客户端,即用户发送一个配置文件请求,然后服务器浏览其数据库中的配置文件,并返回他们的配置文件列表(与该名称)。

CRUD 操作符和 HTTP 方法

使用 API 时,可以根据需要以多种不同的方式向服务器发送请求。这些不同的类型被称为 CRUD( 创建-检索-更新-删除)

对于每个操作,我们都有相应的 HTTP 方法。我们了解了 POST 和 GET inDjango Forms;我们现在将了解其他人。

  • **GET**从网络服务器获取特定信息(只是为了查看)。
  • **POST**向服务器中的数据库添加新信息。
  • **PUT**编辑已有信息,如果还没有,则添加新信息。
  • **DELETE—**从服务器中的数据库中删除信息。

我们将通过下面的例子来理解这一点:

假设我们有一个包含各种物品的 **DB比如椅子、桌子、**等等

  • 使用 GET: 给我们的只是要查看的项目的列表
  • 使用 POST :(以及关于新项目的信息)将该项目添加到 DB 中。
  • 使用 PUT: (连同关于椅子的信息),将更新已经存在的椅子的信息。如果它以前不存在,那么它将创建一个。
  • 使用 DELETE: 只会删除我们想要的特定项目。

什么是 REST API

REST ( 具象状态转移 ) API 类似于标准 API。我们向服务器发送一个请求。但是服务器不会用数据来响应而是用资源来响应。

  • 资源是数据,但这里对数据的思考方式发生了变化。
  • 资源类似于面向对象编程。

也就是说,例如:

考虑一个 URL 端点项目/椅子

在这里,我们可以用同一个端点实现四种不同的功能。

  • 获取**物品/椅子:**获取物品列表
  • 发布物品/椅子:创建一个新的物品椅子
  • 放置物品/椅子:更新/编辑椅子信息
  • 删除**物品/椅子:**从物品中删除椅子

因此,这可以被认为是一个项目资源。

因此,现在我们可以认为我们与服务器的交互不是与单个端点请求的交互,而是与资源的交互(具有不同功能的相同端点)

还有,Rest API 的另一个特点是无状态。我将用一个例子来解释这一点。

如果我们发布一个新的物品椅子的数据,服务器将把这个信息添加到数据库中。一旦添加,服务器就会忘记它。

现在,如果我向服务器发送一个针对那把椅子的 GET 请求,服务器将不会记得我们刚刚在之前的交互中保存了它。它将再次返回数据库,搜索名为 chair 的条目,然后返回信息。

返回信息后,它会再次忘记它

JSON 在客户机-服务器 API 交互中的应用

API 使用 JSON 文本来表示接受返回请求。这意味着,当您在 Twitter 上搜索特定的 tweet 时,您会将请求作为 JSON 发送给服务器。在处理它之后,服务器再次以 JSON 文本的形式发回响应。

这个 JSON 响应被转换成用户可读的格式。

API 中前端和后端服务器之间真正的信息交换是使用 JSON 文本进行的。

JSON 文本看起来就像 python 字典

{item:
	{ chair: {
		Price:120,
		Color: 'red',
		},
	}
}

安装 DRF-姜戈 Rest API 框架

现在要使用 Django REST API我们有一个完整的框架叫做 Django Rest 框架。

我们需要使用 pip 命令将它安装到我们的环境中,就像我们如何安装 Django 一样。

因此,在您的 shell 类型中:

pip install djangorestframework

DRF Installation

DRF Installation

就是这样;现在安装好了。

安装邮递员

POSTMAN 是一个易于使用的平台 API 开发。Postman 的特性简化了构建 API 的每个步骤,并简化了协作,因此您可以更快地创建更好的 API。

下载邮差,

  1. 去浏览器搜索邮差下载。
  2. 单击第一个链接
  3. 下载免费版的邮差
  4. 按照步骤进行安装

POSTMAN

POSTMAN

就是这样。我们准备好出发了。

POSTMAN Window

POSTMAN Window

一旦你下载并安装到你的系统中,它看起来就像这样

创建新的 Django REST API 应用程序

现在让我们制作一个 Django REST API 应用程序,在其中您可以查看、添加、更新和删除列表中的项目

  1. 创建一个名为 ITEM APP 的新应用程序
  2. 在 models.py 中创建一个模型
  3. Serializers.py
  4. Views.py
  5. Urls.py
  6. 邮递员命中

1.创建一个新的 Django 应用程序items app

使用我们在 Django Hello World App 中学到的方法在我们的项目中创建一个名为“itemsapp”的新 Django app

django-admin startapp itemsapp

创建应用程序后,进入第一步执行基本步骤:

  • 将项目中的 urls.py 映射到 app 的 URLs . py
  • 在 settings.py 中添加应用程序名称
  • 等等。遵循 Django app 文章中的步骤

2.创建一个包含项目列表的模型 itemModel。

在 models.py 中,创建一个包含项目所需的所有必要信息的模型,如图所示。

class ItemModel(models.Model):
    id = models.IntegerField(primary_key = True)
    name = models.CharField(max_length = 80, blank = False)
    price = models.IntegerField

    class Meta:
        ordering = ['name']

    def __str__(self):
        return f"{self.name}:{self.price}"

现在我们的模型已经准备好了,我们将学习一个新的东西,叫做

Models

Models

3.在我们的应用中创建 Serializers.py 文件

现在,由于 API 处理 JSON 文本,每当我们将数据库中的信息提供给用户时,我们首先需要将其转换成 JSON反之亦然。

因此,我们需要一个 serializers.py 文件。在您的应用程序中,创建一个新文件"serializer . py ",并在其中添加以下信息。

from rest_framework import serializers
from .models import ItemModel

class ItemSerializer(serializers.ModelSerializer):
    class Meta:
        model = ItemModel
        fields = ['id',name','price']

这里我们将序列化器链接到模型,因为我们需要在将 DB 数据发送给用户之前将其转换成 JSON。所以基本上序列化器既可以作为序列化器(将 DB 信息转换成 JSON)也可以作为反序列化器(将用户给定的 JSON 转换成 Django 可读的语法)。

Serializers

Serializers

在创建视图时,我们将了解更多关于序列化程序如何工作的信息。

4.创建用于查看项目列表的 API 视图

现在,在 Views.py 中添加以下代码:

from django.shortcuts import render,HttpResponseRedirect,Http404
from rest_framework.parsers import JSONParser
from django.http import HttpResponse,JsonResponse
from django.views.decorators.csrf import csrf_exempt
from .models import ItemsModel
from .serializers import ItemSerializer
# Create your views here.

我们将需要以上所有的导入来编写 API 视图。

现在我们将编写 ItemsView ,它将在使用 GET 方法时向我们显示 DB 中存在的项目列表,并让我们在使用 POST 方法时向列表中添加新项目。(终点:项/ )

因此,将下面的代码添加到 views.py 文件中

@csrf_exempt
def ItemsView(request):

    if request.method == 'GET':
        items = ItemsModel.objects.all()
        serializer = ItemSerializer(items, many =True)
        return JsonResponse(serializer.data, safe =False)

    elif request.method == 'POST':
        data = JSONParser().parse(request)
        serializer =ItemSerializer(data = data)

        if serializer.is_valid():
            serializer.save()
            return JsonResponse(serializer.data,status =201)
        return JsonResponse(serializer.errors,status = 400)

这里

  • @ csrf _ except是一个类似于我们在 Django 表单中学到的 {% csrf_token %} 的装饰器。这个装饰器确保传递的信息不会发生任何伪造。
  • 现在,如果请求是 GET那么我们将 DB 中的所有对象存储到 items 变量中。
  • 然后,我们使用序列化程序将特定信息(存储在 items 中)转换成 JSON 格式。由于我们已经从数据库中取出了所有的对象,所以将 many 设置为 TRUE。
  • 一旦信息被转换成 JSON我们就返回适当的 JSON 响应。
  • POST 方法中,由于用户将发送的信息是 JSON 格式的,我们需要将其转换成正确的 Python-Django 可读语法。
  • 所以我们使用 JSONParser 来解析请求,以获得与新项目相关的数据,然后将其存储到变量 data 中。
  • 然后,我们使用序列化程序将从请求中获得的经过解析的 JSON 文本转换成 python 可读的语法。
  • 现在,如果经过解析的序列化数据是有效的,那么我们保存它,否则显示一条错误消息。

现在我们将添加另一个 API 视图 item View(endpoint:item/int:id),它将向我们显示 GET 请求中的特定项目。我们将能够使用 POST 请求更改信息,并使用 delete 请求删除它。

在相同的 views.py 中,添加以下代码:

@csrf_exempt
def ItemView(request,nm):
    try: 
        item = ItemsModel.objects.get(id = nm)
    except ItemsModel.DoesNotExist:
        raise Http404('Not found')

    if request.method == 'GET':
        serializer = ItemSerializer(item)
        return JsonResponse(serializer.data)

    if request.method == 'PUT':
        data = JSONParser().parse(request)
        serializer = ItemSerializer(item,data =data)

        if serializer.is_valid():
            serializer.save()
            return JsonResponse(serializer.data)
        return JsonResponse(serializer.errors, status =400)

    if request.method == "DELETE":
        item.delete()
        return HttpResponse(status =204)

这里,

  • 我们再次像以前一样使用了 @csrf_exempt ,装饰器。
  • 在函数内部,我们将首先尝试获取端点中使用的 id 为的项目(从数据库中获取)。
  • 如果不存在这样的条目,我们将引发一个 Http404( **未找到)**错误。
  • 如果方法是 GET ,我们将使用序列化器将 DB 中的项目信息转换为 JSON 格式,然后将 JSON 响应返回给用户。
  • 如果方法是 **PUT**我们将解析请求以从中获取 JSON 数据,将其发送给序列化程序以将其转换成 python 可读的语法。
  • 注意在 serializer 中,我们还需要传递项目以及解析的数据,因为 Django 需要知道 DB 中的哪个项目需要更新。
  • 如果方法是 **DELETE**我们将从 DB 中删除特定的项目。

就这样,伙计们!!如果你理解序列化器有困难,不要担心;练习一段时间后,你会找到窍门的。

Views

Views

现在我们将修改我们的 urls.py 来适应这两个视图

5.为 urls.py 中的两个视图创建 URL 映射

在 urls.py 中添加 path 函数,将两个 API 视图链接到其适当的端点。因此,在 urls.py 中添加

    path ('items/', ItemsView),
    path('item/<int:nm>/', ItemView),

我们在 Django URL 映射中学习了映射 URL。

Urls 1

Urls 1

此外,使用下面的代码将模型注册到管理站点,如在 Django 管理站点中所学

admin.site.register(ItemModel)


就是这样。现在,我们需要进行迁移,以便在数据库中创建 ItemModel 表。所以在 Shell 中,输入:

python manage.py makemigrations
python manage.py migrate

现在,一旦创建了表,我们就可以运行服务器了

python manage.py runserver

转到管理站点,向我们刚刚创建的 ItemModel 添加一些元素。


使用 POSTMAN 查看端点

让我们利用之前下载并安装的 POSTMAN API 开发环境。

1.获取项目/

现在在搜索 URL 中,输入 URL“**host website/items”**并在左侧,保留方法 GET。

点击发送并观察以下内容:

GET Items

GET Items

我们获得了 DB 中存在的项目列表的信息

2.发布项目/

现在在下面,你会看到一个选项。去那里选择文本JSON ,在下面给出的地方,输入你想要添加的物品的信息。

现在将方法从 GET 改为 POST然后点击 send

POST Items

POST Items

该项目现已包含在数据库中。

3.获取项目/id

现在,在搜索 URL 中,转到端点项目/ < id >并输入您想要的 id。保留 GET 并点击 send 的方法。

GET Item

GET Item

你会得到关于那个特定项目的信息。

4.放置项目/id

再次像在 POST 选项中一样,写下关于预先存在的项目的信息,然后将方法更改为 PUT 并点击 send。

PUT Item

PUT Item

您将看到信息已经更新

4.删除项目/id

现在,将方法改为删除,并点击发送

DELETE Item

DELETE Item

您将会看到,现在特定的项目已被删除。

结论

Django REST API 教程到此为止!我们希望您已经掌握了 Django REST 框架的所有基础知识以及如何使用它们。另外,您可以从官方文档中了解更多关于 Django REST 框架的信息。

请继续关注 Django 主题的更多高级教程!