在Django Rest Framework中创建您的第一个REST API
ccwgpt 2024-10-31 12:33 37 浏览 0 评论
在Django Rest Framework中创建API的教程
在这篇文章中,我将讨论Django Rest Framework或DRF。 DRF用于在Django中创建RESTful API,以后可以由各种应用程序使用。 移动,网络,桌面等。我们将讨论如何在您的计算机上安装DRF,然后将为系统编写API。
在讨论DRF之前,让我们先谈谈REST本身。
什么是Rest
来自维基百科
Representational state transfer (REST) 是一种软件体系结构样式,它定义了一组用于创建Web服务的约束。符合REST体系结构样式的Web服务(称为RESTful Web服务)提供Internet上计算机系统之间的互操作性。 RESTful Web服务允许请求系统通过使用统一且预定义的无状态操作集来访问和操纵Web资源的文本表示。其他类型的Web服务,例如SOAP Web服务,公开了它们自己的任意操作集。[1]
Rest API(应用程序编程接口)是一种无状态的客户端-服务器体系结构,并使用典型的URL方案进行数据交换。它由Roy Fielding于2000年在他的著名论文中首次提出。用于在客户端和服务器之间提供通信的URL通常称为端点。为此使用了不同的HTTP方法:
- GET:-返回请求的数据,该数据可以是记录列表或单个记录。
- POST:-它创建一个新记录。
- PUT / PATCH:-更新现有记录。
- DELETE;删除记录。
返回的数据可以是XML, JSON或其他格式,但前两种是最常见的。
好的,现在您已经了解了REST API,让我们讨论Django Rest Framework本身。
什么是Django Rest Framework
Django Rest Framework是一个开放源代码框架,用于以Python编写RESTful API。 它基于Django框架,因此尽管不是必需的知识,但Django的知识是非常有益的。
因此,我们将为“联系人管理系统”制作API,使用户能够使用我们的API创建/更新和删除联系人。 返回的数据将为JSON格式。
安装与设置
我将使用Pipenv为我们的API设置开发环境。 无论您的计算机上安装了什么东西,Pipenv都使隔离开发环境变得更加容易。 它还允许您选择与计算机上已安装的版本不同的Python版本。 它使用Pipfile来管理所有与项目相关的依赖项。 我不会在这里详细介绍Pipenv,因此只会使用项目所需的命令。
您可以通过运行PyPy安装Pipenv
pip install pipenv
安装后,我们现在必须为项目选择Python版本。 我愿意使用Python 3.8版本而不是机器上已经安装的Py3.7。 要安装Python 3.8,您所要做的就是运行以下命令:
pipenv install --python 3.8
它将如下安装:
您也可以运行
pipenv install --three
,其中三 表示Python3.x。
安装完成后,您可以通过运行以下命令激活虚拟环境
pipenv shell
? ContactAPIs pipenv shell
Launching subshell in virtual environment…
. /Users/AdnanAhmad/.local/share/virtualenvs/ContactAPIs-tI040CTn/bin/activate
? ContactAPIs . /Users/AdnanAhmad/.local/share/virtualenvs/ContactAPIs-tI040CTn/bin/activate
进入外壳后(您会看到类似(ContactAPIs)?ContactAPIs的提示),您将能够安装所需的库。 首先,我们将通过运行以下命令来安装Django:
pipenv install django
请注意,它是pipenv,而不是pip。 当您进入shell时,将使用pipenv。 它的底层使用的是pip,但所有条目都存储在Pipfile中。 然后运行pipenv安装
pipenv install djangorestframework
Pipfile将如下所示:
现在我们必须创建一个Django项目。 要创建Django项目,我们将运行django-admin命令,如下所示:
django-admin startproject contact_api .
它将创建如下目录结构:
到目前为止,我们来看是否可以运行本地开发服务器。 运行命令
python manage.py runserver
如果一切顺利,您应该会看到类似以下的窗口:
美丽,不? 好吧,让我们运行一些现有的迁移。 为此,我们将运行命令
python manage.py migrate
Django默认使用Sqlite3,但您可以始终通过更改设置来使用自己喜欢的RDBMS引擎。 好了,因此创建了所有与系统相关的表。 我们应该可以访问http://127.0.0.1:8000/admin/,但是我们无法登录。在没有任何凭据的情况下,我们怎么办? 所以现在,我们将创建一个超级用户。
python manage.py createsuperuser --email me@example.com --username admin
它将提示您设置密码。 完成操作后,您将进入“管理员”页面,该窗口将类似于以下内容:
现在,我们将创建一个Django App。 为此,我首先进入contact_api文件夹,然后运行以下命令:
(ContactAPIs) ? ContactAPIs cd contact_api
(ContactAPIs) ? contact_api django-admin startapp contact
之后,文件夹结构将如下所示:
(ContactAPIs) ? contact_api tree .
.
├── __init__.py
├── asgi.py
├── contact
│ ├── __init__.py
│ ├── admin.py
│ ├── apps.py
│ ├── migrations
│ │ └── __init__.py
│ ├── models.py
│ ├── tests.py
│ └── views.py
├── settings.py
├── urls.py
└── wsgi.py
Django开发人员可能会发现在项目文件夹中创建应用程序很不寻常,但建议在DRF官方网站上使用。 您始终可以按照自己的方式从项目文件夹中创建应用程序。
现在,我们将在INSTALLED_APPS中包含我们的DRF框架和新创建的应用程序。 因此,转到contact_api文件夹中的settings.py并添加如下所示的条目:
INSTALLED_APPS = [
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
'rest_framework',
'contact_api.contact',
]
请注意最后两个条目。 我们添加了rest_framework以便拥有API功能。 其次,我们添加了新创建的应用程序。 注意该路径。 由于应用在文件目录contact_api 创建了WITHIN,因此我们必须使用点标记来提供完整路径。
现在,我们将为API端点创建模型和视图。 在models.py文件中,我们将编写模型。 该模型将是通过API检索或插入数据的唯一责任。
from django.db import models
# Create your models here.
class Contact(models.Model):
first_name = models.CharField(max_length=50)
last_name = models.CharField(max_length=50)
email = models.CharField(max_length=50)
address = models.CharField(max_length=100)
因此,这是我们的模型,其中包含一些领域。 现在是创建迁移然后进行迁移的时候,以便可以在数据库文件中生成架构。 我们将运行命令
python manage.py makemigrations contact
它将产生类似以下的输出:
(ContactAPIs) ? ContactAPIs python manage.py makemigrations contact
Migrations for 'contact':
contact_api/contact/migrations/0001_initial.py
- Create model Contact
迁移文件已创建。 是要迁移它!
(ContactAPIs) ? ContactAPIs python manage.py migrate
Operations to perform:
Apply all migrations: admin, auth, contact, contenttypes, sessions
Running migrations:
Applying contact.0001_initial... OK
(ContactAPIs) ? ContactAPIs
除了创建以前的迁移,它还创建了我们刚刚创建的迁移。 现在,我们将在admin.py中注册我们的模型,以便我们可以在管理界面中与模型进行交互:
from django.contrib import admin
from .models import Contact
# Register your models here.
admin.site.register(Contact)
如果您访问http://127.0.0.1:8000/admin,您将在那儿找到新创建的Contact模型。
接下来,我们将创建视图和数据序列化器。
首先,我们将创建序列化器。
Serializers 有助于将模型和querySet转换为本地Python数据类型,以便随后将它们呈现为JSON或XML。 由于它们将数据序列化,因此您始终可以将它们反序列化回模型和querySets。 序列化的文件如下所示:
from rest_framework import serializers
from .models import Contact
class Contactializer(serializers.HyperlinkedModelSerializer):
class Meta:
model = Contact
fields = ('id', 'url', 'first_name', 'last_name', 'email', 'address')
导入必要的类后,我们创建了一个类并提到了要序列化的类。 我们还提到了要公开从而序列化的字段。
接下来,我们将创建视图,为此,我们将使用ViewSet。
视图集在一个类下结合了多个视图的逻辑。
现在我们必须设置我们的API端点,为此,我们需要做一些艰苦的工作。 首先,我们必须在我们的app文件夹(即contact文件夹)中创建一个urls.py文件。
from rest_framework import routers
from django.urls import path,include
from . import views
router = routers.DefaultRouter()
router.register('contacts', views.ContactView)
urlpatterns = [
path('',include(router.urls))
]
在这里,您将学习一个新概念Router。如果您来自Laravel,Rails甚至NodeJS的背景,那么您将对路由器的功能有所了解。它将请求路由到适当的资源。 DRF提供三种路由器:简单,默认和自定义。默认路由器类似于简单路由器,它返回所有与CRUD相关的终结点,以及每个记录的终结点的URL和可选的JSON视图。接下来,我们将视图集注册到一个根名称中,该根名称是此处的contacts 联系人。因此,所有端点将在API端点中包含contacts/。一旦注册,您将使用相同的旧include通过包含router.urls来设置端点的路径。在RoR和Laravel世界中,这些被称为足智多谋的溃败,因为您不必创建单独的视图及其各自的URL来进行创建,更新,获取,发布和删除。当然,您总是可以通过添加方法并使用@action装饰器进行装饰来添加自己的自定义端点。例如,检查以下内容:
@action(detail=False, methods=['get'])
def lol(self, request, pk=None):
return Response({'status': 'OK'})
在这里,我们添加了另一条自定义路线,因此当访问http://127.0.0.1:8000/contacts/lol/时,它会返回JSON响应。 我们将detail=False设置为因为它不是一个足智多谋的端点,因此仅服务于一个端点。
好吧,事情还不止于此。 接下来,我们必须将API添加到主urls.py中,为此,我们将在contact/urls.py中执行以下操作
from django.contrib import admin
from django.urls import path,include
urlpatterns = [
path('admin/', admin.site.urls),
path('',include('contact_api.contact.urls')),
]
因此,除了Admin之外,我们终于在主项目的urls.py中包含了我们的API,这使我们可以浏览Admin或其他应用程序URL之外的API。
现在该品尝我们的努力成果了。 转到浏览器上的http://127.0.0.1:8000/contacts/,您将看到类似以下的内容:
它显示了一个用于添加记录和其他内容的精美界面。 您还会看到一个Extra Option按钮,它是针对我们刚刚添加的自定义方法的。 让我们一起玩吧。 我创建了一个动画Gif,供您查看如何以HTML和JSON格式添加记录。 如何列出记录以及如何浏览单个记录。
当然,当您直接通过CURL或其他库访问它时,您将不会看到所有基于HTML的界面。
(ContactAPIs) ? ContactAPIs curl http://127.0.0.1:8000/contacts/
[{"id":1,"url":"http://127.0.0.1:8000/contacts/1/","first_name":"Adnan","last_name":"Ahmad","email":"adnan@mail.com","address":"A29 Sweet House"},{"id":2,"url":"http://127.0.0.1:8000/contacts/2/","first_name":"Ali","last_name":"Ahmad","email":"ali@email.com","address":"5th Street New way Town"}]%
哦,顺便说一句,您可以随时访问http://127.0.0.1:8000/contacts/lol/ 大声笑!
结论
在本教程中,您学习了如何使用Django Rest Framework在Python中创建REST API。 我刚刚给您做了介绍,您可以做很多事情,例如在登录名/密码后面保护某个API端点或使用JWT或其他现代身份验证机制。 我将在以后的文章中尝试覆盖它们。 与往常一样,该代码在Github上可用
https://github.com/kadnan/django-rest-framework-api-tutorial
相关推荐
- 滨州维修服务部“一区一策”强服务
-
今年以来,胜利油田地面工程维修中心滨州维修服务部探索实施“一区一策”服务模式,持续拓展新技术应用场景,以优质的服务、先进的技术,助力解决管理区各类维修难题。服务部坚持问题导向,常态化对服务范围内的13...
- 谷歌A2A协议和MCP协议有什么区别?A2A和MCP的差异是什么?
-
在人工智能的快速发展中,如何实现AI模型与外部系统的高效协作成为关键问题。谷歌主导的A2A协议(Agent-to-AgentProtocol)和Anthropic公司提出的MCP协议(ModelC...
- 谷歌大脑用架构搜索发现更好的特征金字塔结构,超越Mask-RCNN等
-
【新智元导读】谷歌大脑的研究人员发表最新成果,他们采用神经结构搜索发现了一种新的特征金字塔结构NAS-FPN,可实现比MaskR-CNN、FPN、SSD更快更好的目标检测。目前用于目标检测的最先...
- 一文彻底搞懂谷歌的Agent2Agent(A2A)协议
-
前段时间,相信大家都被谷歌发布的Agent2Agent开源协议刷屏了,简称A2A。谷歌官方也表示,A2A是在MCP之后的补充,也就是MCP可以强化大模型/Agent的能力,但每个大模型/Agent互为...
- 谷歌提出创新神经记忆架构,突破Transformer长上下文限制
-
让AI模型拥有人类的记忆能力一直是学界关注的重要课题。传统的深度学习模型虽然在许多任务上取得了显著成效,但在处理需要长期记忆的任务时往往力不从心。就像人类可以轻松记住数天前看过的文章重点,但目前的...
- 不懂设计?AI助力,人人都能成为UI设计师!
-
最近公司UI资源十分紧张,急需要通过AI来解决UI人员不足问题,我在网上发现了几款AI应用非常适合用来进行UI设计。以下是一些目前非常流行且功能强大的工具,它们能够提高UI设计效率,并帮助设计师创造出...
- 速来!手把手教你用AI完成UI界面设计
-
晨星技术说晨星技术小课堂第二季谭同学-联想晨星用户体验设计师-【晨星小课堂】讲师通过简单、清晰的语言描述就能够用几十秒自动生成一组可编辑的UI界面,AIGC对于UI设计师而言已经逐步发展成了帮助我们...
- 「分享」一端录制,多端使用的便捷 UI 自动化测试工具,开源
-
一、项目介绍Recorder是一款UI录制和回归测试工具,用于录制浏览器页面UI的操作。通过UIRecorder的录制功能,可以在自测的同时,完成测试过程的录制,生成JavaScr...
- APP自动化测试系列之Appium介绍及运行原理
-
在面试APP自动化时,有的面试官可能会问Appium的运行原理,以下介绍Appium运行原理。Appium介绍Appium概念Appium是一个开源测试自动化框架,可用于原生,混合和移动Web应用程序...
- 【推荐】一个基于 SpringBoot 框架开发的 OA 办公自动化系统
-
如果您对源码&技术感兴趣,请点赞+收藏+转发+关注,大家的支持是我分享最大的动力!!!项目介绍oasys是一个基于springboot框架开发的OA办公自动化系统,旨在提高组织的日常运作和管理...
- 自动化实践之:从UI到接口,Playwright给你全包了!
-
作者:京东保险宋阳1背景在车险系统中,对接保司的数量众多。每当系统有新功能迭代后,基本上各个保司的报价流程都需要进行回归测试。由于保司数量多,回归测试的场景也会变得重复而繁琐,给测试团队带来了巨大的...
- 销帮帮CRM移动端UI自动化测试实践:Playwright的落地与应用
-
实施背景销帮帮自2015年成立以来,移动端UI自动化测试的落地举步维艰,移动端的UI自动化测试一直以来都未取得良好的落地。然而移动互联网时代,怎样落地移动端的UI自动化测试以快速稳定进行移动端的端到端...
- 编写自动化框架不知道该如何记录日志吗?3个方法打包呈现给你。
-
目录结构1.loguru介绍1.1什么是日志?程序运行过程中,难免会遇到各种报错。如果这种报错是在本地发现的,你还可以进行debug。但是如果程序已经上线了,你就不能使用debug方式了...
- 聊聊Python自动化脚本部署服务器全流程(详细)
-
来源:AirPython作者:星安果1.前言大家好,我是安果!日常编写的Python自动化程序,如果在本地运行稳定后,就可以考虑将它部署到服务器,结合定时任务完全解放双手但是,由于自动化程序与平...
- 「干货分享」推荐5个可以让你事半功倍的Python自动化脚本
-
作者:俊欣来源:关于数据分析与可视化相信大家都听说自动化流水线、自动化办公等专业术语,在尽量少的人工干预的情况下,机器就可以根据固定的程序指令来完成任务,大大提高了工作效率。今天小编来为大家介绍几个P...
你 发表评论:
欢迎- 一周热门
- 最近发表
- 标签列表
-
- MVC框架 (46)
- spring框架 (46)
- 框架图 (58)
- flask框架 (53)
- quartz框架 (51)
- abp框架 (47)
- jpa框架 (47)
- springmvc框架 (49)
- 分布式事务框架 (65)
- scrapy框架 (56)
- shiro框架 (61)
- 定时任务框架 (56)
- java日志框架 (61)
- JAVA集合框架 (47)
- mfc框架 (52)
- abb框架断路器 (48)
- ui自动化框架 (47)
- grpc框架 (55)
- ppt框架 (48)
- 内联框架 (52)
- cad怎么画框架 (58)
- ps怎么画框架 (47)
- ssm框架实现登录注册 (49)
- oracle字符串长度 (48)
- oracle提交事务 (47)