一 Web开发模式
1. 前后端混合开发模式
前后端混合开发模式是一种开发方式,将前端和后端的开发工作结合在一起,以加快项目的开发速度和
提高协作效率。这种模式通常用于快速原型开发、小型项目或敏捷开发中。
在前后端混合开发模式中,前端和后端开发人员紧密合作,共同制定项目需求、设计界面和编写代码。
具体来说,这种模式有以下特点:
1. 交叉开发:前端和后端开发人员在同一时间内并行进行开发,
而不是先完成一个部分再进行另一个部分的开发。
2. 紧密协作:前端和后端开发人员之间需要密切合作,共同解决问题,制定接口规范,
并确保前后端之间的数据交互和功能协调一致。
3. 接口规范:在前后端混合开发中,明确的接口规范尤为重要。
前端和后端需要约定好数据传输的格式、接口命名和参数等。
4. 快速迭代:由于前后端同时进行开发,可以更快地进行迭代和调整,及时响应变化的需求。
5. 敏捷开发:这种开发模式适用于敏捷开发流程,可以在项目开发周期内频繁地进行需求变更和更新。
然而,前后端混合开发模式也需要注意一些问题,例如接口不稳定可能导致前后端频繁修改,
需要严格的接口文档和版本管理。此外,项目的复杂性和团队的规模也会影响这种开发模式的适用性。
2.前后端分离开发模式
前后端分离开发模式是一种软件开发方式,其中前端和后端的开发工作分开进行,彼此解耦,
通过接口进行数据交互。这种模式旨在提高开发效率、降低耦合度,并允许不同团队专注于各自领域的开发。
在前后端分离开发模式中,前端和后端开发人员可以使用不同的编程语言、框架和技术来进行开发。
前端负责构建用户界面、交互和用户体验,后端负责处理业务逻辑、数据库操作和提供数据接口。
主要特点包括:
1. ** 松耦合** :前后端之间通过接口进行数据交互,实现了松耦合的架构,使得前后端团队可以独立开发和更新。
2. ** 独立开发** :前端和后端可以同时进行开发,不会相互阻塞,从而加快项目的开发进度。
3. ** 技术多样性** :前端和后端可以选择最适合自己的技术栈,使得团队可以根据需求灵活选择合适的工具。
4. ** 提高效率** :前端和后端开发人员专注于各自领域的开发,提高了效率和专注度。
5. ** 维护方便** :由于前后端分离,当需求变更或修复问题时,只需修改相应的模块,不会影响到整个系统。
6. ** 适合团队合作** :不同团队可以并行开发,有助于团队协作和项目管理。
然而,前后端分离也需要注意接口设计的合理性、数据传输的安全性以及接口文档的编写和维护等问题。同时,这种模式对项目的规划和架构设计有一定的要求,以确保前后端之间的协同顺畅。
二 API接口
为了在团队内部形成共识、防止个人习惯差异引起的混乱,我们需要找到一种大家都觉得很好的接口实现规范,
而且这种规范能够让后端写的接口,用途一目了然,减少双方之间的合作成本
- api接口:通过网络,规定了前后台信息交互规则的url链接,也就是前后台信息交互的媒介
- https: // www. baidu. com/ books/ - - - > json 格式数据- - - 》接口
- https: // www. cnblogs. com/ liuqingzheng/ articles/ 17400599 . html- - - 》返回界面
- url和接口的区别:Web API接口和一般的url链接还是有区别的,Web API接口简单概括有下面四大特点
- 1 . url:长得像返回数据的url链接
https: // api. map . baidu. com/ place/ v2/ search
- 2. 请求方式:get、post、put、patch、delete
采用get方式请求上方接口
- 3. 请求参数:json或xml格式的key- value类型数据
ak:6E823f587c95f0148c19993539b99295
region:上海
query:肯德基
output:json
- 4. 响应结果:json或xml格式的数据
- https: // api. map . baidu. com/ place/ v2/ search?ak= 6E823f587c95f0148c19993539b99295& region= % E4% B8% 8A% E6% B5% B7& query= % E8% 82 % AF% E5% BE% B7% E5% 9F% BA& output= json
- 典型的api接口长这样
- url地址
- 有请求方式
- 携带参数
- 返回格式是json,xml
- 前端不同编码格式:
- urlencoded: body体中 :username= lqz& password= 123 django的request. POST取出值
- json: body体中 :{ "username" : "lqz" , "password" : "123" } django的request. POST取不出值
- form- data:body中格式固定:数据部分和文件部分- - 》request. POST能取出数据,取不出文件,文件都是从
'- - - - - - - - - - - - - - - - - - - - - - - - - - - - 789048583058585187025897 \r\nContent- Disposition: form- data; name= "username" \r\n\r\nlqz\r\n文件二进制
- django中的文件对象和原来的文件对象
- django:from django. core. files. uploadedfile import InMemoryUploadedFile
- 原生文件:_io. BufferedWriter
- django中文件类没有继承原生文件类,但是有原生文件类所有方法
- 装饰器模版
def warpper_request ( func) :
def inner ( * args, ** kwargs) :
res = func( * args, ** kwargs)
return res
return inner
三 restful规范
1 前后端分离要写接口- - - 》api接口- - - 》接口测试工具postman
2 restful规范是什么,如何来的?
- 一种定义Web API接口的设计风格,尤其适用于前后端分离的应用模式中 的规范
- Roy Fielding的博士论文提出的
3 以后写接口,大致都要遵循一个规范,restful规范- - - 》10 条- - 》
- 1 数据的安全保障- 》url链接一般都采用https协议进行传输- - 》它比http安全
- 2 接口特征表现- - 》url中带api标识
- https: // api. baidu. com/ books/
- https: // www. baidu. com/ api/ books/
- 3 多数据版本共存- - 》url中带版本信息
https: // api. baidu. com/ v1/ books
https: // www. baidu. com/ api/ v2/ books
- 4 数据即是资源,均使用名词(可复数)- - > 前后台交互,交互的数据称之为资源
- 数据即资源,前后端交互的数据称之为资源,url尽量使用名字
- https: // 127.0 .0 .1 / api/ v1/ books/ - - > 表示对图书操作:增加,删除,查询,修改,都用这一个地址
- https: // 127.0 .0 .1 / api/ v1/ get_all_books/
- https: // 127.0 .0 .1 / api/ v1/ delete_books/
- 5 资源操作由请求方式决定
- get 请求获取数据(获取所有,获取单条)
- post 新增数据
- put 修改数据
- delete 删除数据
https: // api. baidu. com/ books - get请求:获取所有书
https: // api. baidu. com/ books/ 1 - get请求:获取主键为1 的书
https: // api. baidu. com/ books - post请求:新增一本书书
https: // api. baidu. com/ books/ 1 - put请求:整体修改主键为1 的书
https: // api. baidu. com/ books/ 1 - delete请求:删除主键为1 的书
- 6 请求地址中带过滤条件- - - 》只针对于搜索所有接口
https: // api. example. com/ v1/ zoos?limit= 10 :指定返回记录的数量
https: // api. example. com/ v1/ zoos?offset= 10 :指定返回记录的开始位置
https: // api. example. com/ v1/ zoos?page= 2 & per_page= 100 :指定第几页,以及每页的记录数
https: // api. example. com/ v1/ zoos?sortby= name& order= asc:指定返回结果按照哪个属性排序,以及排序顺序
https: // api. example. com/ v1/ zoos?animal_type_id= 1 :指定筛选条件
- 7 响应状态码( 两层)
- http响应状态码: 1xx,2xx,3xx,4xx,5xx:https: // www. sohu. com/ a/ 278045231_120014184
- 404 和403 和 405
- 301 和302
- 1xx表示请求正在处理- - - 》前端一般看不到
- 2xx 表示请求处理成功- - 》经常看到
- 201 和200 有什么区别
- 3xx:重定向
- 4xx: 客户端错误
- 5xx:服务端出错
- 成功都返回200 ,而在响应体中带 状态码- - - > code不同公司就不一样
{
"code" : 101 ,
"msg" : "用户名或密码错误"
}
- 补充一:mysql 错误操作都会有个 数字( 10060 ) 文字解释
- 补充二:
- https: // open . weibo. com/ wiki/ Error_code
- 8 响应中带错误信息
{
"code" : 101 ,
"msg" : "用户名或密码错误"
}
- 9 不同操作,返回格式符合如下标准
GET / collection:返回资源对象的列表(数组)
GET / collection/ resource:返回单个资源对象
POST / collection:返回新生成的资源对象
PUT / collection/ resource:返回完整的资源对象
DELETE / collection/ resource:返回一个空文档
- - - 》大家都这么做
{
code: 100
msg: 查询成功
restult: [ { name: 西游记, price: 19 } , { name: 三国, price: 19 } ]
}
- 10 响应中带链接
Hypermedia API,RESTful API最好做到Hypermedia,即返回结果中提供链接,
连向其他API方法,使得用户不查文档,也知道下一步应该做什么
{
"status" : 0 ,
"msg" : "ok" ,
"results" : [
{
"name" : "肯德基(罗餐厅)" ,
"img" : "https://image.baidu.com/kfc/001.png"
}
. . .
]
}
四 序列化和反序列化
序列化: 数据转换格式
序列化分两个阶段:
- 序列化:把我们识别的数据转换成指定的格式提供给别人
- 反序列化:把别人提供的数据转换/ 还原成我们需要的格式
序列化: 把我们识别的数据转换成指定的格式提供给别人。
例如:我们在django中获取到的数据默认是模型对象,但是模型对象数据无法直接提供给前端或别的平台使用,
所以我们需要把数据进行序列化,变成字符串或者json数据,提供给别人。
反序列化:把别人提供的数据转换/ 还原成我们需要的格式。
例如:前端js提供过来的json数据,对于python而言就是字符串,我们需要进行反序列化换成模型类对象,
这样我们才能把数据保存到数据库中
五 drf安装和快速使用
基于django编写符合restful规范的接口了
假设以 Book 表为例,写它的5 个接口
- 1 查询所有
- 2 新增一条
- 3 修改一条
- 4 删除一条
- 5 查询一条
以下是使用原生django编写:
注意:djangorestframework: drf, django的一个第三app- - - 》方便我们快速实现符合restful规范的接口
使用步骤:
1 安装模块
1 django 是2 版本,用不了drf最新(适当降版本),他会卸载django- - - 》装最新4 . x
2 djagno 3.1 .12 可以使用drf最新
- django:3.1 .12
- drf: 3.14 .0
2 在app中注册
INSTALLED_APPS = [
'rest_framework' ,
]
3 写路由
from rest_framework. routers import DefaultRouter
router = DefaultRouter( )
router. register( 'books' , BookView, 'books' )
urlpatterns += router. urls
4 写视图类
from rest_framework. viewsets import ModelViewSet
from . serializer import BookSerializer
class BookView ( ModelViewSet) :
queryset = Book. objects. all ( )
serializer_class = BookSerializer
5 写序列化类
class BookSerializer ( serializers. ModelSerializer) :
class Meta :
model = Book
fields = "__all__"