QNIT.NET

  • Windows系统
  • 系统硬件
  • Mac系统
  • Linux系统
  • 虚拟系统
  • 编程技术
  1. 首页
  2. 编程技术
  3. 正文

【Python】利用Django搭建REST风格API后台服务(一)

2019-12-10 933 0 0

简介

原文地址

最近在开发一款安卓应用,需要用到后台。本来想使用springboot来搭建一个微服务,不过后来发现Django的REST框架实际上也不错,由于这个项目的开发周期是两个礼拜不到,所以没有太多的时间。于是便选择了Django作为应用的后台,合理的使用REST framework这个插件可以帮我们省去非常多的时间,用相对比较少的代码量来实现对数据增删改查的一系列API函数,对短周期的开发非常友好,很值得学习。

这套文章将会从最基本的代码开始记录,一步步搭建完一套完整的后台服务框架,这是我个人的一个学习过程的记录,希望也会对其他人有所帮助。文章会定期更新。

作为文章的第一篇,我们先从一个最小的项目入手,先写一个可以使用的API

注:我这边使用的是MacOS系统、Python3.6、DJango2.0的版本,使用pycharm作为编辑器。

参考资料

由于这是第一篇,所以有些东西得先交代一下。需要有一点点的python和django基础。

python和Django的教程相信大家都能在各大网站上找得到,这里就不多提了。

而REST framework的参考的资料大家可以去 REST framework官网 进行查看。当然都是全英文的。看不懂的童鞋可以去GitHub搜一下有其他大佬的译文,也是蛮不错的。

创建项目

django-admin.py startproject myProject

创建完项目后,目录结构什么的就不多交代了。我们创建一个新的APP,名字就叫api吧。随后会发现根目录下会多一个文件夹,这就是我们创建好的名为api的应用,我们会把api所需要用到的文件放在这个应用的文件夹当中。

python manage.py startapp api

这里要注意,创建完APP后。创建完app后,去myProject(或者你的自己命名的项目)文件夹下,找到setting.py,INSTALLED_APPS列表下添加APP

INSTALLED_APPS = [
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',

'api', # 这行的添加的
]

此时,使用运行项目,会自动生成db.sqlite3数据库

python manage.py runserver

创建一个管理员。根据他的提示输入信息即可。注意,密码不得少于8位数。

python manage.py createsuperuser

Username (leave blank to use 'administrator'): admin
Email address: admin@admin.com
Password:
Password (again):
This password is too common.
Bypass password validation and create user anyway? [y/N]: y
Superuser created successfully.

注:这里可能会有人问,这些命令是哪来的。这是django自带的命令,如果有不清楚的可以自行检索所有命令。输入这条就可以检索所有命令。

python manage.py help

添加依赖

我们利用pip来添加需要用到的依赖库,python的第三方库非常的强大,可以说是什么都有,只有你想不到的?

添加REST framework的依赖

pip install djangorestframework

下载完依赖包后,和上一步的添加APP一样,去setting.py中添加下载好的依赖应用

INSTALLED_APPS = [
    ....

'rest_framework',    #加上这句,加在api的前面
'api',
]

创建模型

我们就以各大教材最经典的“学生类”来当我们本次试验的一个模型类。学生类暂且具有姓名、性别、学号等属性。

由于只是一个demo,为了方便我们就不再创建APP,直接在Api文件下的models.py文件内创建模型吧

class Student(models.Model):
    name = models.CharField(u'姓名', max_length=100, default='no_name')
    sex = models.CharField(u'性别', max_length=50, default='male')
    sid = models.CharField(u'学号', max_length=100, default='0')

    def __unicode__(self):
        return '%d: %s' % (self.pk, self.name)

Django的Models非常好用,只需要写好类模型,再执行数据库同步的相关语句,他会帮你同步到数据库里。

现在我们对数据库进行操作。执行下门两句命令,对数据库进行同步和迁移的操作后,系统会帮我们自动建立数据表。

python manage.py makemigrations
python manage.py migrate

由于我们还没有编写api相关的东西,不过我们还是可以验证我们的模型能不能正常使用。那就是用python自带的admin后台来测试,这是一个自带的非常方便的后台,不清楚的童鞋可以自己百度学习一下如何对它进行定制和使用。

我们在api文件夹下找到admin.py文件,添加如下代码

from .models import Student  # 记得导包

@admin.register(Student)
class BlogTypeAdmin(admin.ModelAdmin):
    list_display = ('pk', 'name')  # 在后台列表下显示的字段

添加完毕后,我们把项目运行起来试试

python manage.py runserver

如果显示以下信息,就表示运行成功了

System check identified no issues (0 silenced).
July 25, 2018 - 10:41:40
Django version 2.0.6, using settings 'myProject.settings'
Starting development server at http://127.0.0.1:8000/
Quit the server with CONTROL-C.

打开浏览器进入http://127.0.0.1:8000/admin 或者 http://localhost:8000/admin

进入后台管理页面,输入刚刚创建的用户名和密码即可。

进来后会看到我们刚刚创建好的Student类,点击进去可以对该类进行增删改查的操作。这些代码全都由django帮我们做好了,并且连视图都有,是不是非常方便?我们先往里面添加几条数据,待会用得到。

序列化

接下来我们来编写api相关的东西。提到这里不得不提到序列化。

我们的目的是访问某一个REST风格的链接来获取相应的资源或者执行其他的命令。比如我们使用GET方法访问http://example.com/api/student/这条命令。我们给他定义一个功能,其含义是“获取所有学生的资源”,便希望它能接受我们的要求,并且响应给我们所需要的相应资源。这些资源当然得是用json格式反馈给我们了。如下就是序列化的结果集:

[
    {
        "pk": 3,
        "name": "小王八",
        "sex": "男",
        "sid": "112"
    },

    {
        "pk": 2,
        "name": "小王",
        "sex": "女",
        "sid": "110"
    },
   ]

说白了,序列化就是把我们需要查找的实体模型,从数据库中取出,并通过序列化的功能转换成通用的资源格式,也就是JSON。

这是便符合我们所期望结果。当然不止是查询(GET),REST风格下的访问方式还有好几个、如最常用的、新增(POST)、修改(PUT)、删除(DELETE)

注:关于json、REST风格、API等这些,如有不懂可以网上搜一下,关于这些方面的资源网上非常多,这里就不多做叙述。

现在我们开始编写序列化的功能。

在api文件夹下创建一个名为serializers.py的文件。里面代码内容为:

from rest_framework import serializers
from .models import Student

class StudentSerializers(serializers.ModelSerializer):
    class Meta:
        model = Student     #指定的模型类
        fields = ('pk', 'name', 'sex', 'sid',)   #需要序列化的属性

model属性是指定一个模型类,就是我们已经写好的Student类,fields是我们需要获取到的类当中的属性,将他们有序排列。这样定义,我们获取的到内容就是这样的json格式:

{
        "pk": 2,
        "name": "小王",
        "sex": "女",
        "sid": "110"
    }

注:pk这个属性我们并没定义,是创建模型时自带的主键,这里改成id也是可以的,它是一个整数

设置视图

编写完序列化后,我们来设置视图的功能。REST framework为我们提供了一套功能相对丰富的视图功能。这个框架里已经集成了增删改查、查询、过滤、排序、分页等一些非常常用的功能,可以说非常强大了。这里我们先来了解一下基本的增删改查功能。

打开api文件夹下的views.py文件。学过django的同学都非常熟悉这个东西,就是我们django下MTV模式的的“视图”了。

REST framework提供了很多种视图的方法,我们这里使用的是viewsets这个类,这个是官方提供相对比较新的一个类,他继承了之前许多的视图类,功能相对来说比较强大,集成度比较高,使用他可以少写很多代码。当然,如果你需要定制更特殊的功能,也没有问题,后续的文章会提到。

我们在views.py中编写视图

from rest_framework import viewsets
from .models import Student
from .serializers import StudentSerializers
# Create your views here.

class StudentViewSet(viewsets.ModelViewSet):
    # 指定结果集并设置排序
    serializer_class = StudentSerializers
    queryset = Student.objects.all().order_by('-pk')
    # 指定序列化的类
    serializer_class = StudentSerializers

order_by是设置列表对主键的排序方式,可以把负号去掉采用升序

这样我们的视图也就写好了?

设置路由

我们在完成前面一系列工作之后,现在需要设置我们的api入口了。

首先,我们在api文件夹下创建一个urls.py文件,用来存放路由地址

from django.conf.urls import include,url
from rest_framework import routers
from api import views

# 定义路由地址
route = routers.DefaultRouter()

# 注册新的路由地址
route.register(r'student' , views.StudentViewSet)

# 注册上一级的路由地址并添加
urlpatterns = [
    url('api/', include(route.urls)),
]

添加完毕后,我们到总路由那去设置,把它包含进去。打开根目录下和项目名称同名的文件夹(我这里是myProject),找到和setting同级的urls.py,添加代码:

from django.contrib import admin
from django.urls import path,include

urlpatterns = [
    path('admin/', admin.site.urls),
    path('', include('api.urls')),    #添加的路由地址
]

这样我们就把路由地址设置好了。

浏览器API测试

我们来测试一下我们写好的API能不能使用。在控制台输入命令:

python manage.py runserver

打开地址http://127.0.0.1:8000/api/便可看到API的视图

打开视图为你提供好的其他链接http://127.0.0.1:8000/api/student/可以查询所有的学生

在下面的输入框输入相应的信息,点击POST可以添加新的资源。

如果我们要访问单独的一位学生,比如他的主键是为3的小王八同学,那就在链接http://127.0.0.1:8000/api/student/3/ (3后面的斜杠记补全就算他后面没有东西了,这是一个好习惯,至于为什么,待会会说到)就可以查询到了

查询到后,可以点击上面的DELETE进行删除,也可以在输入框输入你要修改的内容,点下方的PUT进行修改。这里就不多说了,大家应该都会的。

使用其他工具进行测试

现在问题来了,有的小伙伴可能会问,我已经写好了API了。但是除了视图的那些功能以外,浏览器能输入的URL格式只有GET,应该怎么样去使用他?

大家都知道API可以在很多场景下使用,前台、后台、移动端等。可以用任意的代码去访问URL,并且获取到资源。不清楚的同学去搜一下HTTP请求和你所需要开发的平台下如何调用操作API的方法。?

这里我们用先用一款工具叫做 Postman ,是一款很方便的API测试工具。

这家伙长这样

至于怎么下载,请大家百度搜一下,有chrome内嵌版的,也有各种操作系统的客户端。这里我是下载MacOS版本的客户端。

我们打开Postman,我们分别测试增删改查四个基本的功能。

1. 查找功能(GET)

在地址栏输入URL后选择GET访问

http://localhsost:8000/api/student/

2. 新增功能(POST)

在地址栏输入URL后选择POST后,在Body下构造表单,key为你创建模型时对应的字段,value为对应的属性值,访问

http://localhsost:8000/api/student/

添加成功后会返回一串已经添加的json信息。

3. 修改(PUT)

以刚刚添加的主键为5,名为煞笔的学生为例,访问该学生自己的URL。

这里需要注意,5后面的“/”在这款软件下一定要加,不然会出现无法访问的结果,刚刚上面有提到过。

在其他项目也要养成好的习惯,这样以后开发更大一点的项目对于URL的拼接会减少错误的概率。?

http://localhsost:8000/api/student/5/

选择PUT,构建好需要修改的表单内容

修改通过一样也会返回出修改后的信息

4. 删除(DELETE)

我们将刚刚修改完的主键为5,名为智障的学生给他删除掉

http://localhsost:8000/api/student/5/

选择DELETE,构建好需要修改的表单内容

其他

我们把简单的API后台搭建起来了。

还有更多的内容需要扩展,如权限认证、拦截过滤、分页、搜索、多表关联等REST framework的一大堆功能。

标签: API Django
最后更新:2021-11-24

leon

这个人很懒,什么都没留下

点赞
下一篇 >

文章评论

取消回复
最新 热点 随机
最新 热点 随机
清理 Docker 占用的磁盘空间 CSS常用命名名称 常用正则表达式速查手册,Python文本处理必备 SAS硬盘指示灯状态对照表 电脑的基础认识(硬件篇) 将照片变成漫画风格
安装macOS Mojave提示”这个安装macos应用程序副本已损坏“ 让老机器支持UEFI的启动 常用正则表达式速查手册,Python文本处理必备 【Python】利用Django搭建REST风格API后台服务(三)关于DRF的搜索、分页、排序 快速解决MacOS密码忘记问题 Windows7设置开机自动登录
标签聚合
Navicat 虚拟系统 ESXI Django Mojave MySql API JWT

COPYRIGHT © 2021 QNIT.NET. ALL RIGHTS RESERVED.

THEME KRATOS MADE BY Qnit.net

黔ICP备2021010068号

贵公网安备 52270102000278 号