百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 技术文章 > 正文

官方 Django Rest Framework 教程 - 初学者指南

itomcoil 2025-03-01 14:18 23 浏览

在本教程中,我们将使用 Django Rest Framework (DRF)来构建一个简单的 API。我们将学习如何使用 DRF 提供可浏览的 API,并通过 RESTful 架构设计原则使我们的 API 易于扩展和维护。

首先,我们需要确保 Django Rest Framework 已经安装在我们的项目中。在此之前,请确保已经安装了 Django 并创建了一个新的 Django 项目。

一旦我们的 Django 项目创建完成,我们就可以安装 DRF。我们可以使用 pip 命令来安装它。在命令行中运行以下命令:

pip install djangorestframework

接下来,我们需要在项目的 settings.py 文件中添加 DRF 的配置。找到 INSTALLED_APPS 配置项并在其中添加 'rest_framework'。它应该类似于以下代码:

INSTALLED_APPS = [
    # ...
    'rest_framework',
]

现在我们已经安装并配置好了 DRF,我们可以开始构建我们的 API。在我们的 Django 应用程序中,我们将创建一个新的 app,命名为 snippets。这个应用程序将提供一个简单的模型来存储代码片段,并将使用 DRF 来构建 API。

接下来,我们将定义模型。在 snippets 应用程序的 models.py 文件中添加以下代码:

from django.db import models
from pygments.lexers import get_all_lexers, get_lexer_by_name
from pygments.styles import get_all_styles


LEXERS = [item for item in get_all_lexers() if item[1]]
LANGUAGE_CHOICES = sorted([(item[1][0], item[0]) for item in LEXERS])
STYLE_CHOICES = sorted([(item, item) for item in get_all_styles()])


class Snippet(models.Model):
    created = models.DateTimeField(auto_now_add=True)
    title = models.CharField(max_length=100, blank=True, default='')
    code = models.TextField()
    linenos = models.BooleanField(default=False)
    language = models.CharField(choices=LANGUAGE_CHOICES, default='python', max_length=100)
    style = models.CharField(choices=STYLE_CHOICES, default='friendly', max_length=100)

    class Meta:
        ordering = ['created']

在这个模型中,我们定义了一个名为 Snippet 的模型类。它具有以下字段:

  • created:一个自动生成的 DateTimeField,记录代码片段创建的时间。
  • title:一个可选的 CharField,用于给代码片段命名。
  • code:一个 TextField,用于存储代码片段本身。
  • linenos:一个 BooleanField,用于记录是否要在代码片段中包括行号。
  • language:一个 CharField,用于记录代码片段的编程语言。
  • style:一个 CharField,用于记录代码片段的样式。

接下来,我们将定义 Snippet 的序列化器。在 snippets 应用程序的 serializers.py 文件中添加以下代码:

from rest_framework import serializers
from snippets.models import Snippet, LANGUAGE_CHOICES, STYLE_CHOICES


class SnippetSerializer(serializers.Serializer):
    id = serializers.IntegerField(read_only=True
		created = serializers.DateTimeField()
    title = serializers.CharField(required=False, allow_blank=True, max_length=100)
    code = serializers.CharField(style={'base_template': 'textarea.html'})
    linenos = serializers.BooleanField(required=False)
    language = serializers.ChoiceField(choices=LANGUAGE_CHOICES, default='python')
    style = serializers.ChoiceField(choices=STYLE_CHOICES, default='friendly')

    def create(self, validated_data):
        """
        Create and return a new `Snippet` instance, given the validated data.
        """
        return Snippet.objects.create(**validated_data)

    def update(self, instance, validated_data):
        """
        Update and return an existing `Snippet` instance, given the validated data.
        """
        instance.title = validated_data.get('title', instance.title)
        instance.code = validated_data.get('code', instance.code)
        instance.linenos = validated_data.get('linenos', instance.linenos)
        instance.language = validated_data.get('language', instance.language)
        instance.style = validated_data.get('style', instance.style)
        instance.save()
        return instance



from django.http import Http404
from rest_framework.views import APIView
from rest_framework.response import Response
from rest_framework import status
from snippets.models import Snippet
from snippets.serializers import SnippetSerializer


class SnippetList(APIView):
    """
    List all snippets, or create a new snippet.
    """
    def get(self, request, format=None):
        snippets = Snippet.objects.all()
        serializer = SnippetSerializer(snippets, many=True)
        return Response(serializer.data)

    def post(self, request, format=None):
        serializer = SnippetSerializer(data=request.data)
        if serializer.is_valid():
            serializer.save()
            return Response(serializer.data, status=status.HTTP_201_CREATED)
        return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)


class SnippetDetail(APIView):
    """
    Retrieve, update or delete a snippet instance.
    """
    def get_object(self, pk):
        try:
            return Snippet.objects.get(pk=pk)
        except Snippet.DoesNotExist:
            raise Http404

    def get(self, request, pk, format=None):
        snippet = self.get_object(pk)
        serializer = SnippetSerializer(snippet)
        return Response(serializer.data)

    def put(self, request, pk, format=None):
        snippet = self.get_object(pk)
        serializer = SnippetSerializer(snippet, data=request.data)
        if serializer.is_valid():
            serializer.save()
            return Response(serializer.data)
        return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)

    def delete(self, request, pk, format=None):
        snippet = self.get_object(pk)
        snippet.delete()
        return Response(status=status.HTTP_204_NO_CONTENT)

在这个视图中,我们使用 Django Rest Framework 的 views 模块来定义两个视图类:SnippetList 和 SnippetDetail。这两个视图类将分别处理列表视图和详细视图。在列表视图中,我们将获取所有的 Snippet 实例,并使用 SnippetSerializer 将它们转换为 JSON 格式。在详细视图中,我们将获取特定的 Snippet 实例,并使用 SnippetSerializer 将它转换为 JSON 格式。在创建视图中,我们将从请求数据中获取 Snippet 实例并使用 SnippetSerializer 进行验证和创建。

最后,我们将定义 snippets 应用程序的 URL。在 snippets 应用程序的 urls.py 文件中添加以下代码:

from django.urls import path
from snippets import views

urlpatterns = [
    path('snippets/', views.SnippetList.as_view()),
    path('snippets//', views.SnippetDetail.as_view()),
]

在这个 URL 配置中,我们定义了两个 URL 路径,分别对应于 SnippetList 和 SnippetDetail 视图类。

现在,我们已经完成了 snippets 应用程序的所有组件,并且可以在浏览器中测试它。运行以下命令启动开发服务器:

python manage.py runserver

在浏览器中打开
http://localhost:8000/snippets/,您将看到 SnippetList 视图返回的所有 Snippet 实例的 JSON 格式。您还可以使用 POST 请求将新的 Snippet 实例添加到列表中。

在浏览器中打开
http://localhost:8000/snippets/1/,您将看到 SnippetDetail 视图返回的特定 Snippet 实例的 JSON 格式。您还可以使用 PUT 请求更新这个实例,或使用 DELETE 请求删除这个实例。

以上就是 Django Rest Framework 官方教程的全部内容。通过这个教程,您可以学习如何使用 Django Rest Framework 来构建 RESTful API。

除了本教程所涉及的内容之外,Django Rest Framework 还提供了许多其他功能和选项,例如认证、权限、分页、过滤、搜索等。您可以在官方文档中查找更多信息。

此外,Django Rest Framework 还可以与其他 Django 应用程序和插件配合使用。例如,您可以使用 django-filter 库提供更高级的过滤功能,使用 django-guardian 库提供更复杂的权限管理,使用 django-rest-swagger 库提供交互式文档。

总之,Django Rest Framework 是一个非常强大和灵活的框架,可以帮助您快速构建高质量的 RESTful API。无论您是正在开发自己的 Web 应用程序,还是正在为客户构建 API,Django Rest Framework 都是值得考虑的一个选择。

相关推荐

Python Qt GUI设计:将UI文件转换Python文件三种妙招(基础篇—2)

在开始本文之前提醒各位朋友,Python记得安装PyQt5库文件,Python语言功能很强,但是Python自带的GUI开发库Tkinter功能很弱,难以开发出专业的GUI。好在Python语言的开放...

Connect 2.0来了,还有Nuke和Maya新集成

ftrackConnect2.0现在可以下载了--重新设计的桌面应用程序,使用户能够将ftrackStudio与创意应用程序集成,发布资产等。这个新版本的发布中还有两个Nuke和Maya新集成,...

Magicgui:不会GUI编程也能轻松构建Python GUI应用

什么是MagicguiMagicgui是一个Python库,它允许开发者仅凭简单的类型注解就能快速构建图形用户界面(GUI)应用程序。这个库基于Napari项目,利用了Python的强大类型系统,使得...

Python入坑系列:桌面GUI开发之Pyside6

阅读本章之后,你可以掌握这些内容:Pyside6的SignalsandSlots、Envents的作用,如何使用?PySide6的Window、DialogsandAlerts、Widgets...

Python入坑系列-一起认识Pyside6 designer可拖拽桌面GUI

通过本文章,你可以了解一下内容:如何安装和使用Pyside6designerdesigner有哪些的特性通过designer如何转成python代码以前以为Pyside6designer需要在下载...

pyside2的基础界面(pyside2显示图片)

今天我们来学习pyside2的基础界面没有安装过pyside2的小伙伴可以看主页代码效果...

Python GUI开发:打包PySide2应用(python 打包pyc)

之前的文章我们介绍了怎么使用PySide2来开发一个简单PythonGUI应用。这次我们来将上次完成的代码打包。我们使用pyinstaller。注意,pyinstaller默认会将所有安装的pack...

使用PySide2做窗体,到底是怎么个事?看这个能不能搞懂

PySide2是Qt框架的Python绑定,允许你使用Python创建功能强大的跨平台GUI应用程序。PySide2的基本使用方法:安装PySide2pipinstallPy...

pycharm中conda解释器无法配置(pycharm安装的解释器不能用)

之前用的好好的pycharm正常配置解释器突然不能用了?可以显示有这个环境然后确认后可以conda正在配置解释器,但是进度条结束后还是不成功!!试过了pycharm重启,pycharm重装,anaco...

Conda使用指南:从基础操作到Llama-Factory大模型微调环境搭建

Conda虚拟环境在Linux下的全面使用指南:从基础操作到Llama-Factory大模型微调环境搭建在当今的AI开发与数据分析领域,conda虚拟环境已成为Linux系统下管理项目依赖的标配工具。...

Python操作系统资源管理与监控(python调用资源管理器)

在现代计算环境中,对操作系统资源的有效管理和监控是确保应用程序性能和系统稳定性的关键。Python凭借其丰富的标准库和第三方扩展,提供了强大的工具来实现这一目标。本文将探讨Python在操作系统资源管...

本地部署开源版Manus+DeepSeek创建自己的AI智能体

1、下载安装Anaconda,设置conda环境变量,并使用conda创建python3.12虚拟环境。2、从OpenManus仓库下载代码,并安装需要的依赖。3、使用Ollama加载本地DeepSe...

一文教会你,搭建AI模型训练与微调环境,包学会的!

一、硬件要求显卡配置:需要Nvidia显卡,至少配备8G显存,且专用显存与共享显存之和需大于20G。二、环境搭建步骤1.设置文件存储路径非系统盘存储:建议将非安装版的环境文件均存放在非系统盘(如E盘...

使用scikit-learn为PyTorch 模型进行超参数网格搜索

scikit-learn是Python中最好的机器学习库,而PyTorch又为我们构建模型提供了方便的操作,能否将它们的优点整合起来呢?在本文中,我们将介绍如何使用scikit-learn中的网格搜...

如何Keras自动编码器给极端罕见事件分类

全文共7940字,预计学习时长30分钟或更长本文将以一家造纸厂的生产为例,介绍如何使用自动编码器构建罕见事件分类器。现实生活中罕见事件的数据集:背景1.什么是极端罕见事件?在罕见事件问题中,数据集是...