什么是DRF?

在这里插入图片描述

DRFDjango REST framework的缩写,官网上说:Django REST framework一个强大而灵活的工具包用于构建Web API
简单来说:通过DRF创建API后,就可以通过HTTP请求获取创建更新删除数据(CRUD)。

那么为什么构建API呢?
在Django中,我们通过model-view-template实现后端和前端通信。但前端未必是用Djangotemplate实现的,也可以用单独的前端框架(如vue实现这个时候需要一种统一方法前后通信。目前一种成熟的方法就是API。

那么什么是REST?

如果你对DRF是用于构建Web API的说法已经满意了,就可以跳过这段了。
那么什么是REST?
REST(即 REpresentational State Transfer)是一种风格用于网络上的计算机系统之间提供标准,使系统更容易相互通信。特点是无状态分离客户端服务器

就是说,当你的API遵循了这种风格时,就可以称为RESTful API
关于如何设计出符合REST风格的API,可以参考一峰的《RESTful API 设计指南

那么用DRF实现就是RESTful API吗?其实DRF没有强制实现
官网TOPIC,REST --> Hypermedia,Hateoas中有这样一段话:

首先,免责声明。“Django REST 框架这个名字是在 2011 年初决定的,选择它只是为了确保开发人员很容易找到这个项目。在整个文档中,我们尝试使用更简单技术正确术语“Web API”。

官网一个例子

一个官网例子来感受一下。
创建一个简单的API,允许管理员查看编辑系统中的用户和组。

详细过程推荐官网https://www.djangorestframework.org/tutorial/quickstart/

配置项目

首先安装drf
pip install djangorestframework

然后创建一个Django项目并创建应用

mkdir tutorial
cd tutorial

django-admin startproject tutorial .
cd tutorial
django-admin startapp quickstart

这里创建项目应用方式有点不同,按照他的这个就行。

settings.py中的INSTALLED_APPS添加rest_framework

INSTALLED_APPS = [
    ...
    'rest_framework',
]

同步数据库
python manage.py migrate
创建超级用户admin密码设置password123:
python manage.py createsuperuser --email admin@example.com --username admin

创建API

接下来就是重点,我们要创建一个序列化程序model转换成json格式

1.创建序列化
quickstart应用下面创建serializers.py

from django.contrib.auth.models import User, Group
from rest_framework import serializers


class UserSerializer(serializers.HyperlinkedModelSerializer):
    class Meta:
        model = User
        fields = ['url', 'username', 'email', 'groups']


class GroupSerializer(serializers.HyperlinkedModelSerializer):
    class Meta:
        model = Group
        fields = ['url', 'name']

序列化类(Serializer)将Model转换序列化的JSON对象
上面构建了User和Group序列化类。序列化类看起来和django的Form很像。

2.创建view
quickstart/views.py

from django.contrib.auth.models import User, Group
from rest_framework import viewsets
from rest_framework import permissions
from tutorial.quickstart.serializers import UserSerializer, GroupSerializer


class UserViewSet(viewsets.ModelViewSet):
    """
    API endpoint that allows users to be viewed or edited.
    """
    queryset = User.objects.all().order_by('-date_joined')
    serializer_class = UserSerializer
    permission_classes = [permissions.IsAuthenticated]


class GroupViewSet(viewsets.ModelViewSet):
    """
    API endpoint that allows groups to be viewed or edited.
    """
    queryset = Group.objects.all()
    serializer_class = GroupSerializer
    permission_classes = [permissions.IsAuthenticated]

我们使用了ModelViewSet来快速构建一组view。由于背后实现了很多方法,这看起来有些像魔法

3.配置url
tutorial/urls.py中:

from django.urls import include, path
from rest_framework import routers
from tutorial.quickstart import views

router = routers.DefaultRouter()
router.register(r'users', views.UserViewSet)
router.register(r'groups', views.GroupViewSet)

# Wire up our API using automatic URL routing.
# Additionally, we include login URLs for the browsable API.
urlpatterns = [
    path('', include(router.urls)),
    path('api-auth/', include('rest_framework.urls', namespace='rest_framework'))
]

因为我们使用的是ViewSet而不是view,所以我们可以通过简单地将ViewSet注册到Router来自动生成API的 URL conf

可以发现,和Django程序相比,我们没有template前端显示,而是写了序列化类提供API。前端可以分离出来,使用API来和后端通信。

django
drf
图片来自:一图看懂Django和DRF(https://zhuanlan.zhihu.com/p/53957464))

测试API:

使用浏览器访问网址
http://127.0.0.1:8000/users/

在这里插入图片描述

由于设置权限,没登陆查看不了。点击login管理员账号adminpassword123)登陆
在这里插入图片描述

可以看到JSON格式数据

也可以通过httpie工具(可以用pip安装发送http请求获取数据
http -a admin:password123 http://127.0.0.1:8000/users/

参考

DRF官网https://www.djangorest-framework.org/
https://www.djangorest-framework.org/topics/rest-hypermediahateoas/
一图看懂Django和DRF:https://zhuanlan.zhihu.com/p/53957464
一文彻底弄懂REST API:https://zhuanlan.zhihu.com/p/536437382
RESTful API 设计指南https://www.ruanyifeng.com/blog/2014/05/restful_api.html

原文地址:https://blog.csdn.net/qq_41068877/article/details/132382704

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任

如若转载,请注明出处:http://www.7code.cn/show_38422.html

如若内容造成侵权/违法违规/事实不符,请联系代码007邮箱suwngjj01@126.com进行投诉反馈,一经查实,立即删除

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注