Django Rest framework使用简介

  • Post author:
  • Post category:其他


在开发Web应用中,有两种应用模式:

  1. 前后端不分离[客户端看到的内容和所有界面效果都是由服务端提供出来的。]

图片

2.

前后端分离

[把前端的界面效果(html,css,js分离到另一个服务端,python服务端只需要返回数据即可]。前端形成一个独立的网站,服务端构成一个独立的网站

图片


什么是API?

如果我们把前端页面看作是一种用于展示的客户端,那么 API 就是为客户端提供数据、操作数据的接口。

例如:我们经常使用的淘宝商城就有很多的客户端,Web, iOS 和 Android端,但是当我们在 Web 端搜索商品时得到的结果和在 iOS 和 Android 端得到的结果却是一样的。这是因为,我们在不同客户端搜索的时候,都访问了后端同一个 API 。这样后端针对前端的同一种需求,只需开发一种接口,就可满足前端不同终端对于该资源的调用,大大降低了开发工作量,节约了开发时间。

目前市面上大部分公司开发人员使用的接口服务架构主要有:restful、rpc、soap。


什么是RESTful API?

将所有的事物抽象为资源,资源对应唯一的标识。RESTful为表现层状态转移,是一种以资源为中心的web软件架构风格。

资源:使用URL指向一个实体。

表现层:资源的表现形式;比如图片、HTML文本等。

状态转移:使用GET/ POST/ PUT/ DELETE等HTTP动词操作资源,实现资源状态转变。

RESTful风格的API即为RESTful API。通过GET/ POST/ PUT/ DELETE来获取/新建/更新/删除资源。一般使用JSON格式返回数据。大多数web框架都有相应的插件支持RESTful API。


RESTful API设计规范

HTTP方法 url 动作
GET http://[hostname]/api/users 检索用户列表
GET http://[hostname]/api/users/[user_id] 检索单个用户
POST http://[hostname]/api/users 创建新用户
PUT http://[hostname]/api/users/[user_id] 更新用户信息
DELETE http://[hostname]/api/users/[user_id] 删除用户


什么是序列化和反序列化?

两者都是数据转换格式,比如我们在django中获取到的数据默认是模型对象,但是模型对象数据无法直接提供给前端或别的平台使用,所以需要把数据进行序列化,变成字符串或者json数据,提供给别人,这是序列化。

再比如前端js提供过来的json数据,对于python而言就是字符串,我们需要进行反序列化换成模型类对象,这样才能把数据保存到数据库中,这是反序列化。


Django Rest framework

Django REST framework是一个内置在django里面的子应用,可以快速的开发REST API接口应用。

安装

pip install djangorestframeworkpip install markdown       # 为browsable API 提供Markdown支持。pip install django-filter  # Filtering支持。

创建Django项目

django-admin startproject drfdemo

在settings.py下添加APP

INSTALLED_APPS = [    ...    'rest_framework',]

在项目中如果使用rest_framework框架实现API接口,主要有以下三个步骤:

  • 将请求的数据(如JSON格式)转换为模型类对象

  • 通过模型类对象进行数据库操作,完成客户端请求的增删查改

  • 将模型类对象转换为响应的数据(如JSON格式)

接下来以学生管理为例介绍下使用drf写代码的过程:

创建子应用:

python manage.py startapp students

添加子应用到settings​​​​​

INSTALLED_APPS = [    ...    'students',]

创建students/models.py模型类对象:

from django.db import models

# Create your models here.

sex_choice = (
    (0, '女'),
    (1, '男'),
)


class Students(models.Model):
    # 表字段声明
    name = models.CharField(null=False, max_length=20, verbose_name="姓名")
    age = models.IntegerField(verbose_name="年龄")
    sex = models.IntegerField(choices=sex_choice, default=1, verbose_name="性别")
    class_name = models.CharField(max_length=20, verbose_name="班级名称")
    description = models.TextField(max_length=200, verbose_name="个人简介")

    # 表信息
    class Meta:
        # 声明数据表名
        db_table = "tb_students"
        verbose_name = "学生"
        verbose_name_plural = verbose_name

    # 模型的操作方法
    def __str__(self):
        return self.name

输入密码后创建数据库

mysql -uroot -p
mysql> create database students charset=utf8;Query OK, 1 row affected (0.04 sec)
mysql> use students;Database changedmysql> show tables;Empty set (0.02 sec)

Django连接mysql数据库

pip install pymysql

在主应用的__init__.py中设置pymysql作为数据库驱动

import pymysql

pymysql.install_as_MySQLdb()

settings.py中配置账号密码

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.mysql',
        'NAME': "students",
        "HOST": "127.0.0.1",
        "PORT": 3306,
        "USER": "root",
        "PASSWORD": "rootroot",
    }
}

数据迁移

python manage.py makemigrationspython manage.py migrate

创建序列化器

首先我们要定义一些序列化程序,子应用下创建serializers.py。

StudentModelSerializer类用于处理序列化与反序列化。

from rest_framework import serializers
from .models import Students


class StudentModelSerializer(serializers.ModelSerializer):
    # 需要进行数据转换的字段

    # 当前转换的模型类相关声明
    class Meta:
        model = Students
        fields = "__all__"  # 对所有字段操作
    # 验证数据的方法[反序列化:接收客户端的数据]

    # 操作数据的带密码[反序列化:保存数据(添加/更新)]

编写视图views.py

from django.shortcuts import render

# Create your views here.

from rest_framework.viewsets import ModelViewSet
from .models import Students
from .serializers import StudentModelSerializer

# 使用类视图CBV创建,取到queryset后进行序列化操作
class StudentAPIView(ModelViewSet):
    queryset = Students.objects.all()  # 指明该视图的查询集
    serializer_class = StudentModelSerializer  # 指明使用的序列化器

在students下创建urls.py定义路由

from .views import StudentAPIView
from rest_framework.routers import DefaultRouter

urlpatterns = []

router = DefaultRouter()  # 处理视图的路由器
router.register("stu", StudentAPIView)  # 向路由器中注册视图集
urlpatterns += router.urls  # 将路由器列表追加写入django的路由列表中

在总路由中添加students子应用的路由​​​​​​​

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

urlpatterns = [
    path('admin/', admin.site.urls),
    path('students/', include("students.urls"))
]

# django.urls.path 用于编写字符串路由

# django.urls.re_path 用于编写正则路由

测试API,命令行启动服务器

python manage.py runserver

可以从命令行访问我们的API,使用诸如

curl

curl: 利用URL语法在命令行方式下工作的开源文件传输工具。

curl -X get "http://127.0.0.1:8000/students/"

直接访问http://127.0.0.1:8000/students/stu/ 添加学生

图片

在Student Api List中可以查看所有学生信息,也可以进行增删查改(POST/DELETE/GET/PUT)

图片

也可以通过携带用户id的url访问单个用户

http://127.0.0.1:8000/students/stu/2/

图片

稀有物种女程序猿,日更python、网络、算法等相关知识。日拱一卒。欢迎各位催更扯淡一条龙!



版权声明:本文为Snippers原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。