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

原文地址

简介

最近在开发一款安卓应用,需要用到后台。本来想使用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',#这行的添加的
]

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

python manage.py createsuperuser

注:这里可能会有人问,这些命令是哪来的。这是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

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

image.png

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

image.png

序列化

接下来我们来编写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):
    # 指定结果集并设置排序
        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的视图

image.png

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

image.png

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

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

image.png

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

使用其他工具进行测试

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

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

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

这家伙长这样image.png

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

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

1. 查找功能(GET)

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

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

image.png

2. 新增功能(POST)

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

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

image.png

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

3. 修改(PUT)

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

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

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

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

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

image.png

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

4. 删除(DELETE)

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

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

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

image.png

其他

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

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

同时另外一边会讲解在Android、JavaScript、Python、Java、IOS的应用下如何优雅的使用这套API。留着以后讲吧。

猜你喜欢

转载自blog.csdn.net/weixin_40193776/article/details/81210215