zl程序教程

您现在的位置是:首页 >  其他

当前栏目

跟着官方文档学Python——Django Rest framework

2023-02-18 16:23:10 时间

跟着官方文档学Python

Django Rest framework

这周将会持续更新跟着官方文档学Python系列文章,主要是围绕web框架以及其他后端组件的官方文档展开学习。日拱一卒,让我们开始吧!

在开发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 djangorestframework
pip 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 changed
mysql> 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 makemigrations
python 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/