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

在Django Rest Framework中创建您的第一个REST API

ccwgpt 2024-10-31 12:33 30 浏览 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

相关推荐

团队管理“布阵术”:3招让你的团队战斗力爆表!

为何古代军队能够以一当十?为何现代企业有的团队高效似“特种部队”,有的却松散若“游击队”?**答案正隐匿于“布阵术”之中!**今时今日,让我们从古代兵法里萃取3个核心要义,助您塑造一支战斗力爆棚的...

知情人士回应字节大模型团队架构调整

【知情人士回应字节大模型团队架构调整】财联社2月21日电,针对原谷歌DeepMind副总裁吴永辉加入字节跳动后引发的团队调整问题,知情人士回应称:吴永辉博士主要负责AI基础研究探索工作,偏基础研究;A...

豆包大模型团队开源RLHF框架,训练吞吐量最高提升20倍

强化学习(RL)对大模型复杂推理能力提升有关键作用,但其复杂的计算流程对训练和部署也带来了巨大挑战。近日,字节跳动豆包大模型团队与香港大学联合提出HybridFlow。这是一个灵活高效的RL/RL...

创业团队如何设计股权架构及分配(创业团队如何设计股权架构及分配方案)

创业团队的股权架构设计,决定了公司在随后发展中呈现出的股权布局。如果最初的股权架构就存在先天不足,公司就很难顺利、稳定地成长起来。因此,创业之初,对股权设计应慎之又慎,避免留下巨大隐患和风险。两个人如...

消息称吴永辉入职后引发字节大模型团队架构大调整

2月21日,有消息称前谷歌大佬吴永辉加入字节跳动,并担任大模型团队Seed基础研究负责人后,引发了字节跳动大模型团队架构大调整。多名原本向朱文佳汇报的算法和技术负责人开始转向吴永辉汇报。简单来说,就是...

31页组织效能提升模型,经营管理团队搭建框架与权责定位

分享职场干货,提升能力!为职场精英打造个人知识体系,升职加薪!31页组织效能提升模型如何拿到分享的源文件:请您关注本头条号,然后私信本头条号“文米”2个字,按照操作流程,专人负责发送源文件给您。...

异形柱结构(异形柱结构技术规程)

下列关于混凝土异形柱结构设计的说法,其中何项正确?(A)混凝土异形柱框架结构可用于所有非抗震和抗震设防地区的一般居住建筑。(B)抗震设防烈度为6度时,对标准设防类(丙类)采用异形柱结构的建筑可不进行地...

职场干货:金字塔原理(金字塔原理实战篇)

金字塔原理的适用范围:金字塔原理适用于所有需要构建清晰逻辑框架的文章。第一篇:表达的逻辑。如何利用金字塔原理构建基本的金字塔结构受众(包括读者、听众、观众或学员)最容易理解的顺序:先了解主要的、抽象的...

底部剪力法(底部剪力法的基本原理)

某四层钢筋混凝土框架结构,计算简图如图1所示。抗震设防类别为丙类,抗震设防烈度为8度(0.2g),Ⅱ类场地,设计地震分组为第一组,第一自振周期T1=0.55s。一至四层的楼层侧向刚度依次为:K1=1...

结构等效重力荷载代表值(等效重力荷载系数)

某五层钢筋混凝土框架结构办公楼,房屋高度25.45m。抗震设防烈度8度,设防类别丙类,设计基本地震加速度0.2g,设计地震分组第二组,场地类别为Ⅱ类,混凝土强度等级C30。该结构平面和竖向均规则。假定...

体系结构已成昭告后世善莫大焉(体系构架是什么意思)

实践先行也理论已初步完成框架结构留余后人后世子孙俗话说前人栽树后人乘凉在夏商周大明大清民国共和前人栽树下吾之辈已完成结构体系又俗话说青出于蓝而胜于蓝各个时期任务不同吾辈探索框架结构体系经历有限肯定发展...

框架柱抗震构造要求(框架柱抗震设计)

某现浇钢筋混凝土框架-剪力墙结构高层办公楼,抗震设防烈度为8度(0.2g),场地类别为Ⅱ类,抗震等级:框架二级,剪力墙一级,混凝土强度等级:框架柱及剪力墙C50,框架梁及楼板C35,纵向钢筋及箍筋均采...

梁的刚度、挠度控制(钢梁挠度过大会引起什么原因)

某办公楼为现浇钢筋混凝土框架结构,r0=1.0,混凝土强度等级C35,纵向钢筋采用HRB400,箍筋采用HPB300。其二层(中间楼层)的局部平面图和次梁L-1的计算简图如图1~3(Z)所示,其中,K...

死要面子!有钱做大玻璃窗,却没有钱做“柱和梁”,不怕房塌吗?

活久见,有钱做2层落地大玻璃窗,却没有钱做“柱子和圈梁”,这样的农村自建房,安全吗?最近刷到个魔幻施工现场,如下图,这栋5开间的农村自建房,居然做了2个全景落地窗仔细观察,这2个落地窗还是飘窗,为了追...

不是承重墙,物业也不让拆?话说装修就一定要拆墙才行么

最近发现好多朋友装修时总想拆墙“爆改”空间,别以为只要避开承重墙就能随便砸!我家楼上邻居去年装修,拆了阳台矮墙想扩客厅,结果物业直接上门叫停。后来才知道,这种配重墙拆了会让阳台承重失衡,整栋楼都可能变...

取消回复欢迎 发表评论: