Django REST框架中的可浏览API

Django REST框架中的可浏览API

Django REST框架中的可浏览API功能为不同的资源生成了HTML输出。它有助于通过任何网络浏览器与RESTful网络服务进行交互。要启用这个功能,我们应该在请求头中为Content-Type键指定text/html。它可以帮助我们使用网络浏览器来浏览API,并可以进行不同的HTTP请求。在本节中,我们将使用Django REST API框架中的可浏览API功能。

创建一个简单的项目来演示可浏览的API

让我们来创建我们的应用程序机器人所需的模型、序列化器和视图。

创建模型

在Django中,模型是以面向对象的方式处理数据库的类。每个模型类指的是一个数据库表,模型类中的每个属性指的是一个数据库列。在这里,我们将创建以下模型。

  • RobotCategory (Robot Categories)
  • Manufacturer (Manufacturer Details)
  • Robot (Robot Details)

RobotCategory模型要求。

  • 机器人类别名称

制造商模式要求。

  • Manufacturer name

机器人模型需要。

  • Robot name
  • 一个指向机器人类别模型的外键
  • 一个指向制造商模型的外键
  • Currency
  • Price
  • Manufacturing date

让我们来看看HTTP动词,范围语义在我们的机器人Restful网络服务中的应用。

HTTP动词 范围 语义 URL
GET 机器人类别 检索一个机器人类别 http://localhost:8000/robocategory/{id}/
GET 机器人类别的集合 检索集合中的所有机器人类别 http://localhost:8000/robocategory/
POST 机器人类别的集合 在集合中创建一个新的机器人类别 http://localhost:8000/robocategory/{id}/
PUT 机器人类别 更新一个机器人类别 http://localhost:8000/robocategory/{id}/
DELETE 机器人类别 删除一个机器人类别 http://localhost:8000/robocategory/{id}/
GET 制造商 检索一个制造商 http://localhost:8000/manufacturer/{id}/
GET 制造商集合 检索集合中的所有制造商 http://localhost:8000/manufacturer/
POST 制造商的集合 在集合中创建一个制造商 http://localhost:8000/manufacturer/{id}/
PUT 制造商 更新一个制造商 http://localhost:8000/manufacturer/{id}/
DELETE 制造商 删除一个制造商 http://localhost:8000/manufacturer/{id}/
GET 机器人 检索一个机器人 http://localhost:8000/robot/{id}/
GET 机器人的集合 检索集合中的所有机器人 http://localhost:8000/robot/
POST 机器人的集合 在集合中创建一个机器人 http://localhost:8000/robot/{id}/
PUT 机器人 更新一个机器人 http://localhost:8000/robot/{id}/
DELETE 机器人 删除一个机器人 http://localhost:8000/robot/{id}/

让我们为机器人类别、制造商、机器人以及它们之间的关系创建模型。你可以在models.py文件中加入以下代码。

from django.db import models
  
class RobotCategory(models.Model):
    name = models.CharField(max_length=150, unique=True)
  
    class Meta:
        ordering = ('name',)
  
    def __str__(self):
        return self.name
  
class Manufacturer(models.Model):
    name = models.CharField(max_length=150, unique=True)
  
    class Meta:
        ordering = ('name',)
  
    def __str__(self):
        return self.name
  
class Robot(models.Model):
    CURRENCY_CHOICES = (
        ('INR', 'Indian Rupee'),
        ('USD', 'US Dollar'),
        ('EUR', 'Euro'),
    )
  
    name = models.CharField(max_length=150, unique=True)
    robot_category = models.ForeignKey(
        RobotCategory,
        related_name='robots',
        on_delete=models.CASCADE)
    manufacturer = models.ForeignKey(
        Manufacturer,
        related_name='robots',
        on_delete=models.CASCADE)
    currency = models.CharField(
        max_length=3,
        choices= CURRENCY_CHOICES,
        default='INR')
    price = models.IntegerField()
    manufacturing_date = models.DateTimeField()
  
    class Meta:
        ordering = ('name',)
  
    def __str__(self):
        return self.name
Python

这里我们有三个类是django.db.models.Model类的子类。

  • RobotCategory
  • Manufacturer
  • Robot

机器人类与RobotCategory模型和Manufacturer模型保持多对一的关系。这种关系是通过使用 django.db.models.ForeignKey 类实现的。代码如下。

    robot_category = models.ForeignKey(
        RobotCategory,
        related_name='robots',
        on_delete=models.CASCADE)
    manufacturer = models.ForeignKey(
        Manufacturer,
        related_name='robots',
        on_delete=models.CASCADE)
Python

related_name参数创建了一个反向关系。在这里,related_name的值’robots’创建了一个从RobotCategory到Robot,以及从制造商到Robot的反向关系。这有利于获取属于某个机器人类别的所有机器人,也有利于基于制造商的机器人。

接下来,你可以执行迁移过程并应用所有生成的迁移。你可以使用下面的命令

python manage.py makemigrations

python manage.py migrate

创建序列化器

现在,我们需要将RobotCategory、Manufacturer和Robot实例序列化。这里,我们将使用HyperlinkedModelSerializer来处理模型关系。你可以查看DRF序列化器关系主题来详细了解。

from rest_framework import serializers
from robots.models import RobotCategory, Manufacturer, Robot
  
class RobotCategorySerializer(serializers.HyperlinkedModelSerializer):
    robots = serializers.HyperlinkedRelatedField(
        many=True,
        read_only=True,
        view_name='robot-detail')
  
    class Meta:
        model = RobotCategory
        fields = '__all__'
  
  
class ManufacturerSerializer(serializers.HyperlinkedModelSerializer):
    robots = serializers.HyperlinkedRelatedField(
        many=True,
        read_only=True,
        view_name='robot-detail')
  
    class Meta:
        model = Manufacturer
        fields = '__all__'
  
class RobotSerializer(serializers.HyperlinkedModelSerializer):
    robot_category = serializers.SlugRelatedField(
        queryset=RobotCategory.objects.all(), slug_field='name')
    manufacturer = serializers.SlugRelatedField(
        queryset=Manufacturer.objects.all(), slug_field='name')
    currency = serializers.ChoiceField(
        choices=Robot.CURRENCY_CHOICES)
    currency_name = serializers.CharField(
        source='get_currency_display',
        read_only=True)
  
    class Meta:
        model = Robot
        fields = '__all__'
Python

RobotCategorySerializer和ManufacturerSerializer类是HyperlinkedModelSerializer类的子类,反向关系(RobotCategory到Robot和Manufacturer到Robot)使用HyperlinkedRelatedField来表示,并将许多和read_only属性设置为True。View_name – robot-detail – 允许可浏览的API功能为用户提供一个点击设施,以呈现超链接。

RobotSerializer类也是HyperlinkedModelSerializer类的一个子类。RobotSerializer类声明了两个属性–robot_category 和 manufacturer–持有serializers.SlugRelatedField的实例。一个SlugRelated Field通过一个唯一的slug属性代表一种关系。

创建视图

让我们利用Django REST框架提供的基于类的通用视图来处理HTTP请求并提供适当的HTTP响应。你可以查看DRF基于类的视图的详细解释。

from django.shortcuts import render
  
from rest_framework import generics
from rest_framework.response import Response
from rest_framework.reverse import reverse
  
from robots.models import RobotCategory, Manufacturer, Robot
from robots.serializers import RobotCategorySerializer, \
     ManufacturerSerializer, RobotSerializer
  
  
class ApiRoot(generics.GenericAPIView):
    name = 'api-root'
    def get(self, request, *args, **kwargs):
        return Response({
            'robot-categories': reverse(RobotCategoryList.name, request=request),
            'manufacturers': reverse(ManufacturerList.name, request=request),
            'robots': reverse(RobotList.name, request=request)
            })    
  
  
class RobotCategoryList(generics.ListCreateAPIView):
    queryset = RobotCategory.objects.all()
    serializer_class = RobotCategorySerializer
    name = 'robotcategory-list'
  
class RobotCategoryDetail(generics.RetrieveUpdateDestroyAPIView):
    queryset = RobotCategory.objects.all()
    serializer_class = RobotCategorySerializer
    name = 'robotcategory-detail'
  
class ManufacturerList(generics.ListCreateAPIView):
    queryset = Manufacturer.objects.all()
    serializer_class = ManufacturerSerializer
    name= 'manufacturer-list'
  
class ManufacturerDetail(generics.RetrieveUpdateDestroyAPIView):
    queryset = Manufacturer.objects.all()
    serializer_class = ManufacturerSerializer
    name = 'manufacturer-detail'
  
class RobotList(generics.ListCreateAPIView):
    queryset = Robot.objects.all()
    serializer_class = RobotSerializer
    name = 'robot-list'
  
class RobotDetail(generics.RetrieveUpdateDestroyAPIView):
    queryset = Robot.objects.all()
    serializer_class = RobotSerializer
    name = 'robot-detail'
Python

在这里,我们的视图类从rest_framework.generics导入,我们利用了两个基于通用类的视图 – ListCreateAPIView和RetrieveUpdateDestroyAPIView。

你可以注意到一个ApiRoot类,它是generics.GenericAPIView的子类,为我们的网络服务的根创建了一个端点。它为使用可浏览的API功能浏览资源提供了便利。

class ApiRoot(generics.GenericAPIView):
    name = 'api-root'
    def get(self, request, *args, **kwargs):
        return Response({
            'robot-categories': reverse(RobotCategoryList.name, request=request),
            'manufacturers': reverse(ManufacturerList.name, request=request),
            'robots': reverse(RobotList.name, request=request)
            })    
Python

get方法返回一个Response对象(作为字符串的键/值对),其中有视图的描述性名称和它的URL。

设置URL Conf

进入应用程序(robots)文件夹,创建一个名为urls.py文件的新文件。你可以添加以下代码。

from django.urls import path
from robots import views
  
urlpatterns = [
    path('robocategory/',
         views.RobotCategoryList.as_view(),
         name='robotcategory-list'),
    path('robocategory/<int:pk>/',
         views.RobotCategoryDetail.as_view(),
         name='robotcategory-detail'),
    path('manufacturer/',
         views.ManufacturerList.as_view(),
         name='manufacturer-list'),
    path('manufacturer/<int:pk>/',
         views.ManufacturerDetail.as_view(),
         name='manufacturer-detail'),
    path('robot/',
         views.RobotList.as_view(),
         name='robot-list'),
    path('robot/<int:pk>/',
         views.RobotDetail.as_view(),
         name='robot-detail'),
    path('',
        views.ApiRoot.as_view(),
        name=views.ApiRoot.name)
]
Python

它定义了请求中必须匹配的URL模式,以执行views.py文件中定义的基于类的视图的特定方法。现在我们必须设置根URL的配置。你可以添加下面的代码。

from django.contrib import admin
from django.urls import path, include
  
urlpatterns = [
    path('', include('robots.urls')),
]
Python

如何使用可浏览的API向API发出请求

让我们编写并发送HTTP请求,在响应中生成text/html内容。RESTFul网络服务使用BrowsableAPIRenderer类来生成HTML内容。接受text/html的HTTPie命令如下。

http -v :8000/robot/ “Accept:text/html

分享命令提示的截图供你参考

Django REST框架中的可浏览API

在使用可浏览API之前,让我们使用HTTPie命令为机器人类别、制造商和机器人创建一个新条目。该命令如下。

http POST :8000/robocategory/ name=”Articulated Robots”

http POST :8000/manufacturer/ name=”Fanuc”

http POST :8000/robot/ name=”FANUC M-710ic/50″ robot_category=”Articulated Robots” manufacturer=”Fanuc” currency=”USD” price=37000 manufacturing_date=”2019-10-12 00:00:00+00:00″

GET HTTP请求

现在,让我们用浏览器来浏览 “robots “Restful网络服务。你可以使用下面的URL。

http://localhost:8000/

分享一下浏览器的截图供大家参考

Django REST框架中的可浏览API

你可以点击与机器人类别、制造商和机器人相对应的链接,查看数据。分享显示机器人结果的浏览器截图(http://localhost:8000/robot/)

Django REST框架中的可浏览API

POST HTTP请求

接下来,让我们创建一个新的机器人类别。你可以浏览下面的链接并向下滚动。

http://localhost:8000/robocategory/

分享浏览器截图供您参考

Django REST框架中的可浏览API

你可以输入新的机器人类别的名称,然后点击POST按钮。这里,它以HTML形式显示。如果你选择Raw数据,选择媒体类型为application/json,将新的机器人类别名称填入名称字段中,然后点击POST按钮。分享该截图供您参考。

Django REST框架中的可浏览API

分享输出截图

Django REST框架中的可浏览API

让我们创建一个新的制造商,你可以浏览以下网址

http://localhost:8000/manufacturer/

分享浏览器屏幕截图

Django REST框架中的可浏览API

你可以输入制造商名称(ABB)并点击POST按钮。浏览器显示的输出如下所示

Django REST框架中的可浏览API

最后,让我们为机器人创建一个新条目。你可以浏览下面的网址并向下滚动。

http://localhost:8000/robot/

让我们来填充数据。分享一下浏览器的截图供大家参考

Django REST框架中的可浏览API

在这里,你可以注意到,机器人类别、制造商和货币是下拉字段。在填入条目后,你可以点击POST按钮。下面分享一下显示的输出截图。

Django REST框架中的可浏览API

PUT HTTP请求

让我们来编辑有pk值2的机器人的价格。你可以浏览下面的网址并向下滚动。

http://localhost:8000/robot/2/

分享一下浏览器的截图。你可以把价格改为27000,然后点击PUT按钮。

Django REST框架中的可浏览API

分享一下输出的屏幕截图。

Django REST框架中的可浏览API

DELETE HTTP请求

你可以创建一个新的测试条目,用pk值浏览URL。

http://localhost:8000/robot/2/

你可以注意到一个DELETE按钮。分享一下下面的浏览器屏幕截图。

Django REST框架中的可浏览API

在点击删除按钮时,浏览器也会进行确认。你可以在确认窗口中点击删除按钮。分享下面的屏幕截图。

Django REST框架中的可浏览API

如果删除成功,会显示以下输出。

Django REST框架中的可浏览API

让我们总结一下

通过本节,我们了解了如何利用Django REST API框架中的可浏览API功能。我们组成并发送了HTTP请求,生成了文本/html内容作为响应,还在网络浏览器中分析了响应。

Python教程

Java教程

Web教程

数据库教程

图形图像教程

大数据教程

开发工具教程

计算机教程

登录

注册