跟着官方文档学Python——Django Rest framework
跟着官方文档学Python
Django Rest framework
这周将会持续更新跟着官方文档学Python系列文章,主要是围绕web框架以及其他后端组件的官方文档展开学习。日拱一卒,让我们开始吧!
在开发Web应用中,有两种应用模式:
- 前后端不分离[客户端看到的内容和所有界面效果都是由服务端提供出来的。]
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/
相关文章
- 记一次git丢失代码找回
- 记 ThinkPHP 项目部署
- MongoDB按时间分组
- 记一次Github提交PR过程
- Docusaurus配置Gitalk评论插件
- 使用Github Action自动化部署
- 搭建GitLab代码管理仓库
- 记 Github 学生认证
- Gitea 与 Drone 实践
- WP插件CodeColorer兼容PHP7
- PHP时间函数总结
- 在Linux上使用sysstat的iostat监控系统IO
- PHP编译错误的解决办法
- 修改Linux系统语言
- thinkphp钩子的实现
- thinkphp框架解析1 -- 只是一个开始
- PHP一些不为人知的使用方法
- git在公司内部的使用实践
- thinkphp框架解析0 -- 起源
- PHP的框架常用函数