【一】前后端开发模式
1.前后端混合---》用的模板语法dtl,后端进行渲染:
-django template language 模板语法
-{{}}
-{%%}
-后端的处理的到的数据,前端用模板语法,渲染出来--》渲染完后浏览器会对模板语法进行处理,得到的页面是是纯前端页面,里面不会有模板语法
2.前后端分离---》通过写api接口,前后端进行数据交互json
eg:前端用ajax对指定的api地址链接提交请求,然后后台得到请求回返回数据,在ajax把得到的数据,进行处理,给前端渲染
【二】api接口
1.api接口是什么?
就是符合restful规范(前后台信息交互的规则)的链接,用不同的请求方式有不同的操作数据
2.api接口内容
-1.url:url链接
-2.请求方式:get(对数据进行查,有两种查全部还是查局部),post(增加数据),delete(删除数据,带参数的),put(改数据,带参数)
-3.请求参数:可以是json或xml(用的极少)格式
地址栏中带参数eg:login/?name=llh
请求体中:不同的编码格式:urlencoded(默认),json,form-data(文件格式)
"""当你想在HTTP请求中使用JSON编码格式时,你需要在请求头(Headers)中指定Content-Type为application/json。"""
-4.响应结果:json或xml
补充回忆:
"""
http协议:
-请求首行:版本协议 请求路径 请求方式
-请求头:很多的键值对
-换行
-请求体:不同的编码格式
"""
【三】接口测试工具
1.postman
-可以模拟发送http请求
-可以发送任意请求
-可以携带请求头,请求体,请求参数
下载地址:https://www.postman.com/
-win:Postman-win64-Setup.exe
-mac:Postman-win64-Setup.dmg
2.apifox可以了解一下
apifox=postman++ Swagger[接口文档] + Mock[模拟测试数据] + JMeter[压测工具]
下载地址:https://apifox.com/
postman 使用如下
【四】restful规范(重点)
# 1 前后端分离后,后端写api接口
-接口不能乱写
-有些规范
-restful规范:公共的规范,大家都尽量遵守的规范
-公司自己的规范
-RESTful是一种定义Web API接口的设计风格,尤其适用于前后端分离的应用模式中
#规范内容
-1.数据安全保障-->保证url链接使用https
-https比http更安全
-2.接口中带api标识(以下两种都可以)
-https://api.baidu.com
-https://www.baidu.com/api
-3.接口中带版本标识(看公司规则有的是2,有的是v2这样)
-https://api.baidu.com/v1
-https://api.baidu.com/v2
-4.数据就是资源,所以最好都是使用名词,可以是名词复数,但是也有不可避免的时候
-https://api.baidu.com/users
-https://api.baidu.com/books
-https://api.baidu.com/book
-5.通过请求方式,决定资源的操作方式(增删改查curd) https://api.baidu.com/books - get请求:获取所有书
https://api.baidu.com/books - post请求:新增一本书书
https://api.baidu.com/books/1 - get请求:获取主键为1的书
https://api.baidu.com/books/1 - put请求:整体修改主键为1的书
https://api.baidu.com/books/1 - delete请求:删除主键为1的书
-6.请求地址中带过滤条件
https://api.example.com/v1/zoos?name=monkey
-7.响应中带状态码
- http响应状态码:1xx,2xx,3xx,4xx,5xx
- 公司自定义的状态码
-100 成功
-101 xx错误
-102 xx错误
- mysql:以后遇到错误,不要搜文字,搜错误码
-{code:100}
-8.响应中带错误信息
-{code:101,msg:"用户名密码错误"}
-{code:100,msg:"成功"}
-9返回的结果,对不同的操作,服务器返回的结果应符合如下规范
GET /collection:返回资源对象的列表(数组) --》返回你查到的
[{name:红楼梦,price:100},{name:红楼梦1price:90}]
GET /collection/resource:返回单个资源对象--》返回你查到的
-{name:红楼梦,price:100}
POST /collection:返回新生成的资源对象 --》返回你增加的
-{name:红楼梦,price:100}
PUT /collection/resource:返回完整的资源对象 --》返回你修改后的
-{name:红楼梦,price:100}
DELETE /collection/resource:返回一个空文档 --》返回空
-10返回数据中带url链接
-即返回结果中提供链接,连向其他API方法,使得用户不查文档,也知道下一步应该做什么
eg:
{
"status": 0,
"msg": "ok",
"results":[
{
"name":"肯德基(罗餐厅)",
"img": "https://image.baidu.com/kfc/001.png"
}
...
]
}
# 最后,比较好的接口返回格式
{
"code": 0,
"msg": "ok",
"results":[
{
"name":"肯德基(罗餐厅)",
"location":{
"lat":31.415354,
"lng":121.357339
},
"address":"月罗路2380号",
"province":"上海市",
"city":"上海市",
"area":"宝山区",
"street_id":"339ed41ae1d6dc320a5cb37c",
"telephone":"(021)56761006",
"detail":1,
"uid":"339ed41ae1d6dc320a5cb37c"
}
...
]
}
【五】序列化和反序列化
1.序列化就是把数据转换成指定的格式
eg:在django中数据默认是模型对象(queryset对象),但是模型对象无法直接给前端用,所以需要序列化,变成json格式给别人。
"""
因为它们包含了数据库查询的元信息和Django模型层的逻辑,而前端(尤其是JavaScript或HTML)通常期望的是简单的数据结构,如JSON。
"""
2.反序列化:就是被序列化的数据,转换成原本的格式
eg:前端js提供过来的json数据,对于python而言就是字符串,我们需要进行反序列化转换成模型类对象,这样我们才能保存到数据库中
"""
当这些数据通过HTTP请求(如POST或PUT请求)发送到后端Python服务器时,它们并不是以Python对象的形式直接存在的。相反,这些数据是作为HTTP请求体的一部分,以字符串的形式发送的。这个字符串是JSON格式的,但它仍然是一个字符串,只是其内容遵循了JSON的语法规则。
"""
【六】drf安装和快速使用
#1 以book表为例
-写符合restful规范的5个接口
#2 drf是什么?
django rest framwork:django框架上 一个可以快速实现restful规范接口的 快速开发框架
# 3 安装
pip3 install djangorestframework
最新drf支持django4.x以上
django:pip3 install django==4.2.14
drf:pip3 install djangorestframework --upgrade # 3.15.2
# 4 关于软件版本
eg:python:
3.12.x
3.11.09 # 小版本做bug更改
中间的数表示对功能进行升级
x表示改了bug
# 1 urls中
"""在这个文件中,你使用SimpleRouter来自动生成URL路由。你注册了一个名为task的路由,它关联到TaskView视图集,并且指定了路由名称也为task。然后,你将路由器生成的URL添加到urlpatterns列表中。"""
from rest_framework.routers import SimpleRouter
router = SimpleRouter()
router.register('task', TaskView, 'task')
urlpatterns = [
]
urlpatterns += router.urls
# 2 views中
"""在这个文件中,你定义了一个TaskView类,它继承自ModelViewSet。ModelViewSet是一个提供完整CRUD(创建、检索、更新、删除)操作的视图集。你指定了查询集为Task.objects.all(),这意味着API将能够访问数据库中所有的Task对象。你还指定了序列化器类为TaskSerializer。"""
from .models import Task
from .serializer import TaskSerializer
from rest_framework.viewsets import ModelViewSet
class TaskView(ModelViewSet):
queryset = Task.objects.all()
serializer_class = TaskSerializer
# 3 serializer.py
在这个文件中,你定义了一个TaskSerializer类,它继承自serializers.ModelSerializer。你指定了模型为Task,并且使用fields = '__all__'来指示序列化器应该包含模型的所有字段。
from rest_framework import serializers
from .models import Task
class TaskSerializer(serializers.ModelSerializer):
class Meta:
model = Task
fields = '__all__'
# 4 models.py
from django.db import models
class Book(models.Model):
name = models.CharField(max_length=32)
price = models.IntegerField()
注意:出现这种错误
'the URL doesn't end in a """slash""" and you have APPEND_SLASH set'-->slash就是因为postman对url的末尾加斜杆是严格,不像浏览器会自动添加
一般在delete和put请求的时候