使用Django REST框架开发API
如果您知道所从事领域的基础知识,那么您可以掌握任何技术,以开发人员的身份达到更高的水平并创建更好的产品。在本文中,我们将逐步讨论构建API及其操作方法。我相信这对于所有初学者Django开发人员都会有用,因为在每个应用程序或软件中都使用REST API来连接后端和前端部分。如果掌握了这一点,则可以构建各种产品。
为什么要使用Django REST框架?
许多框架都允许您轻松地为博客应用程序构建API,但是我们仅使用一种Django REST框架。它在许多方面都很方便,并具有以下优点:
- 它的Web浏览API对您的开发人员来说是一个巨大的可用性胜利。
-
身份验证策略包括OAuth1和OAuth2的软件包。
-
序列化支持ORM和非ORM数据源。
- 一路向下可自定义。如果您不需要更强大的功能,只需使用基于函数的常规视图。
- 它具有广泛的文档资料和强大的社区支持。
- 它受到Mozilla,Red Hat,Heroku和Eventbrite等国际知名公司的使用和信任。
API逐步指南
在此Django REST框架教程中,我们将详细介绍构建API的所有阶段。
设置您的开发环境
首先,您必须为您的操作系统安装Python依赖项。如果您使用的是Windows,则可以使用本手册或VirtualBox轻松地将Linux安装为辅助操作系统。
要继续,请使用pyenv,这是一种简单而有效的Python管理工具。这是我们的助手。它使我们能够更改全局Python版本,安装多个Python版本,设置特定于项目的Python版本以及管理虚拟Python环境。
如果您使用的是Mac OS或Linux,则应易于安装:
$git clone https://github.com/pyenv/pyenv.git ~/.pyenv
定义环境变量 PYENV_ROOT
指向克隆pyenv repo的路径。然后加 $PYENV_ROOT/bin
给你 $P新高
用于访问pyenv命令行实用程序。
$echo 'export PYENV_ROOT="$HOME/.pyenv"' >> ~/.bashrc
$echo 'export P新高="$PYENV_ROOT/bin:$P新高"' >> ~/.bashrc
将pyenv单元添加到您的外壳中以启用填充和自动补全功能。
$echo -e 'if command -v pyenv 1>/dev/null 2>&1; thenn eval "$(pyenv init -)"nfi' >> ~/.bashrc
重新启动外壳程序,以便路径更改生效。现在,您可以开始使用pyenv。
$exec "$SHELL"
此时,安装最新的Python稳定版本。现在这个…
$pyenv install 3.7.4
……并为您的项目创建环境。
$pyenv virtualenv 3.7.4 blog
创建一个Django项目
现在,我们将创建一个项目文件夹,并导航到新创建的目录。
$mkdir projects && cd projects
下一步是创建Django项目。有几种方法可以做到这一点。
就个人而言,我更喜欢从模板开始项目,并使用已经在我们的Web开发公司中实现的Django Stars后端框架。这是一个很棒的工具,因为…
- Django项目是根据Django Stars代码样式要求进行格式化的,
- django-environ有助于将所有配置保留在环境中,
- psycopg2是默认的数据库驱动程序,
- django-extensions / ipython / ipdb用于调试目的,
- 提供了带有pylava的pytest进行测试,并且
- 重新定义的startapp命令允许您根据Django Stars Code Style要求创建应用。
这是可帮助您从模板开始项目的命令:
$curl https://be.skeletons.djangostars.com/startproject | bash
首先,将为您提供多个Python版本。选择3.7版本的Python。
将项目名称设置为django_blog。
由于我们将使用Django Rest Framework,因此我们应该选择第3个选项:
如果您知道自己的项目需要Celery,也可以选择第一个选项,然后按OK。
无论如何,我们要做的就是从模板创建项目。现在,转到项目名称目录:
$cd django_blog
这是我们项目的结构:
根据要求安装软件包
要运行该项目,我们需要安装一些软件包,这些软件包在 requirements/dev.txt.
因此,我们安装了具有本地开发要求的软件包。
导航到API目录:
$cd api
并安装依赖项。
如果需要添加任何其他软件包,只需将软件包添加到dev.txt文件以进行本地开发,或者将其添加到common.txt(如果需要在服务器上安装)。
接下来,我们将必须添加默认情况下未包含在我们安装的软件包中的Pillow软件包。打开requirements/common.txt
文件,然后将Pillow == 6.1.0添加到末尾。然后运行:
$pip install -r requirements/dev.txt
该文件包含将要安装的所有软件包的列表。
引导数据库
我们的项目需要一个数据库。大多数Django开发人员都喜欢在所有环境(即开发,登台和生产系统)中使用PostgresQL。有些人将SQLite用于本地开发,而将PostgreSQL用于生产中。 Django ORM允许您处理两个数据库。我强烈建议您使开发工作站和产品尽可能相似,并使用相同的数据库。
有几种引导数据库的方法:
- 使用SQLite
为了使数据库自举更容易,我们可以使用SQLite。它是一个进程内库,可实现自包含,无服务器,零配置的事务型SQL数据库引擎。
您所需要做的就是打开.env文件并替换:
与
在这里,我们使用django-environ软件包,该软件包允许您根据您的环境定义配置。您可以通过The Twelve Factor App找到有关此方法的更多信息。
- 使用PostgreSQL
PostgreSQL是一个功能强大的开源对象关系数据库系统。它使用并扩展了SQL语言,并具有许多功能,可让您安全地存储和扩展最复杂的数据工作负载。该系统比SQLite复杂一些,因此您可能想了解更多有关它的信息。
使用Docker安装PostgreSQL更加容易,Docker是一种开源工具,可自动在软件容器内部署应用程序。如果您还不熟悉Docker,请随时查看有关如何安装它以及如何使用docker-compose的说明。
然后只需打开一个新标签并运行:
$docker-compose -f build/docker-compose-dev.yml up
接下来,我们应该应用初始迁移:
$python manage.py migrate
这会将先前所有未应用的迁移应用于Django安装随附的数据库。
https://github.com/olegkovalov/django_blog/commit/4f9b20bafc69fb686026d112592c549bd8b6e858
创建博客应用程序
至此,我们已经创建了一个Django项目,安装了具有要求的软件包,并引导了数据库。这意味着我们现在终于可以使用以下命令创建博客应用程序:
$python manage.py startapp blog
这样,您还创建了一个新目录。它将在 apps/blog.
现在,我们应该在 ‘INSTALLED_APPS’
。
向您的博客添加“博客” ‘INSTALLED_APPS’
放置在 ‘api/django_blog/settings/django.py’
API的测试驱动开发(TDD)
正如您可能已经了解的那样,测试驱动开发是一种在开始实现应用程序的业务逻辑之前专注于编写测试的方法。编写测试首先需要您真正考虑您想要从代码中得到什么。但是除此之外,TDD还具有许多其他好处:
- 快速反馈和详细规范;
- 减少了返工时间和调试器时间;
- 可维护,灵活且易于扩展的代码;
- 缩短上市时间;
- 提高开发人员的生产力;
- 实体代码;和
- 干净的界面。
另外,TDD会告诉您您的最后更改(或重构)是否破坏了以前的工作代码。此外,它会强制简化代码–您仅会根据测试要求编写代码。另外,您不得不编写只关注一件事的小类。进一步,它使设计得以发展并适应您对问题不断变化的理解。
生成的单元测试很简单,可以作为代码的文档。由于TDD用例是作为测试编写的,因此其他开发人员可以将测试视为代码应如何工作的示例。
在为API编写测试之前,让我们退后一步,看看HTTP及其与Django REST Framework的交互方式。
超文本传输协议(HTTP)是用于分布式,协作式超媒体信息系统的应用程序协议。 HTTP定义了诸如GET,POST,PUT,DELETE,OPTIONS和HEAD之类的方法,以指示应对所标识的资源执行的所需操作。这些方法可以通过安全性和幂等性的特征来定义(您可以在此处找到更多信息)。根据协议,REST API依赖于这些方法,因此可以对每种类型的操作随意使用适当的HTTP方法。
让我们将其应用于资源“帖子”。
如何编写测试
使用unittests框架,编写测试变得非常容易。
打开‘api/django_blog/apps/blog/tests/test_models.py’
文件并添加以下代码:
打开‘api/django_blog/apps/blog/models/post.py’
文件,并定义帖子和标签的模型:
我们的Post模型继承自 ‘CoreModel’
,因此在中定义的字段和方法 ‘CoreModel’
可以添加到 ‘Post’
模型。
现在,让我们对我们创建的模型进行首次测试:
$python manage.py test
这意味着测试已成功运行。
打开‘api/django_blog/apps/blog/tests/tests.py’
并为您的API添加测试:
序列化器
序列化器是一个框架,可将复杂的数据(例如查询集和模型实例)转换为原生Python数据类型。然后,可以轻松地将它们渲染为 JSON,XML 或其他内容类型。序列化器也朝相反的方向工作-反序列化允许在验证输入数据后将解析后的数据转换回复杂类型。 REST框架中的序列化器以类似于Django的Form和ModelForm类的方式工作。
声明序列化器
打开‘api/django_blog/apps/blog/rest_api/serializers/post.py’
并添加:
现在,我们可以使用 PostSerializer
序列化帖子或帖子列表。
打开‘api/django_blog/apps/blog/rest_api/views/blog_views.py'
并添加以下代码以定义API视图:
将端点的URL添加到
‘api/django_blog/apps/blog/rest_api/urls.py’
这将是您的API可用的URL。
打开‘api/urls.py’
并包括博客的应用程序URL:
运行测试
现在,您可以使用以下命令测试您的API:
$python manage.py test
瞧测试已成功完成。
可浏览的API
API可能代表应用程序编程接口,但人类也必须能够阅读API –有人必须进行编程。因此是可浏览的API。使用Django REST框架,可以在请求HTML格式时为每个资源生成易于使用的HTML输出。这些页面使您可以轻松浏览资源,以及构建表单以使用POST,PUT和DELETE将数据提交到资源。
让我们使用可浏览的REST Framework接口测试我们的API。首先,启动开发服务器:
$python manage.py runserver_plus
然后,打开您选择的浏览器并访问以下URL:
用图像文件创建一个新帖子。填写“标题”和“文本”字段,在底部的表单中选择一个图像文件,然后按“ POST”。该页面将重新加载新内容。
如果您想处理真实的帖子,请随时访问此页面。
版本控制
版本控制是API设计的重要组成部分,它允许您改善API资源的表示形式并更改不同客户端之间的行为。 REST框架提供了许多不同的版本控制方案。版本控制由传入的客户端请求确定,并且可以基于请求URL或请求标头。
在此示例中,我们使用url路径版本控制方法。
打开 ‘api/django_blog/settings/django.py’
并添加:
如果响应已更改,并且您决定定义其他API版本,则可以按以下方式处理它:
记录您的API
REST框架为生成OpenAPI模式提供了内置支持。这些可以与允许您构建API文档的工具一起使用。
REST框架提供的可浏览API允许您的API完全自我描述。您只需访问浏览器中的URL,即可获取每个API端点的文档。
但是,还有许多出色的第三方文档包。例如,让我们尝试集成drf-yasg。其目标是实现尽可能多的OpenAPI规范(嵌套模式,命名模型,响应主体,枚举/模式/最小/最大验证器,表单参数等),并生成可与代码生成工具一起使用的文档。 。
打开终端,然后输入:
$pip install -U drf-yasg
打开 ‘api/django_blog/settings/django.py’
并添加INSTALLED_APPS ‘drf_yasg’
包:
另外,对于生成的文档,我们应该包括URL:
您可以在本文档中找到有关您的API的文档。
如果您想实现新功能或玩转,请随时克隆或创建我的git hub存储库。
现在,让我们看看为什么我们了解到为什么Django REST Framework对于构建API如此实用。 Django REST框架(DRF)提供了大量功能:
- 使用通用视图轻松创建资源–它们使您能够快速构建与数据库模型紧密映射的API视图;
- 身份验证机制将传入的请求与一组标识凭据关联;
-
权限授予对任何经过身份验证的用户的访问权限,并拒绝对任何未经身份验证的用户的访问权限;
-
节流指示一种临时状态,用于控制客户端可以向API发出的请求的速率;
-
通过Django提供的缓存实用程序进行缓存;
-
过滤允许您限制响应中返回的项目。
-
分页使您可以选择将多大结果集拆分为单独的数据页;
-
状态码– REST框架包括一组命名常量,可用于使代码更透明和可读。
-
版本控制以改变不同客户端之间的行为;和
-
可浏览的API使您可以读取API。
如果您仍然有疑问并且想了解更多信息,那么有很多很棒的Django REST API教程 和 自我完善的资源。这是我们的软件开发团队Django Stars强烈推荐的阅读清单。而且,如果您有任何机会必须处理嵌套对象,那么这里有一个有用的库可能会派上用场。另外,请随时访问django_blog存储库以获取想法和灵感。但是,正如我之前说的,如果您对基础知识非常了解,则可以在此基础上继续学习。考虑到通用API的使用方式,您将可以使用任何种类的产品,这将使您成为不可或缺的团队成员和软件开发的通用战士。
有关如何使用Django REST Framework开发API的指南最初发布在Django Stars博客上。由Oleg Kovalyov撰写-Django Stars的软件工程师主管