一 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:6E823f587c95f0148c19993539b99295region:上海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 resreturn inner
三 restful规范
1 前后端分离要写接口- - - 》api接口- - - 》接口测试工具postman2 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/ bookshttps: // 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编写:
'''http://127.0.0.1/books/ get查询所有http://127.0.0.1/books/ post新增一条http://127.0.0.1/books/id put新增一条http://127.0.0.1/books/id delete新增一条http://127.0.0.1/books/id get查询一条''' from django. views import View
from . models import Bookclass BookView ( View) : def get ( self, request) : books = Book. objects. all ( ) books_list = [ ] for item in books: books_list. append( { 'name' : item. name, 'price' : item. price} ) res = { 'code' : 200 , 'msg' : '查询成功' , 'data' : books_list} return JsonResponse( res) def post ( self, request) : name = request. POST. get( 'name' ) price = request. POST. get( 'price' ) if name and price: Book. objects. create( name= name, price= price) res = { 'code' : 200 , 'msg' : '数据添加成功' } else : res = { 'code' : 400 , 'msg' : '数据添加失败,请认真核对参数' } return JsonResponse( res) class BookDetailView ( View) : def put ( self, request, pk) : int_data_dict = json. loads( request. body) name = int_data_dict. get( 'name' ) price = int_data_dict. get( 'price' ) book = Book. objects. get( pk= pk) book. name = namebook. price = pricebook. save( ) return JsonResponse( { 'code' : 100 , 'msg' : '查询成功' , 'data' : { 'name' : book. name, 'price' : book. price} } ) def get ( self, request, pk) : book_obj = Book. objects. filter ( pk= pk) . first( ) if book_obj: res = { 'code' : 200 , 'msg' : f'图书id为 { book_obj. pk} 的数据查询成功' , 'data' : { 'name' : book_obj. name, 'price' : book_obj. price} } else : res = { 'code' : 1006 , 'msg' : '暂无你查询的数据' } return JsonResponse( res) def delete ( self, request, pk) : book = Book. objects. filter ( pk= pk) . first( ) if book: book. delete( ) res = { 'code' : 200 , 'msg' : f'图书id为 { pk} 的数据查询删除成功' } else : res = { 'code' : 1007 , 'msg' : '你要删除的数据不存在' } return JsonResponse( res) 注意:djangorestframework: drf, django的一个第三app- - - 》方便我们快速实现符合restful规范的接口** ** * drf快速写接口** ** ** ** **
使用步骤:1 安装模块1 django 是2 版本,用不了drf最新(适当降版本),他会卸载django- - - 》装最新4 . x2 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 DefaultRouterrouter = DefaultRouter( ) router. register( 'books' , BookView, 'books' ) urlpatterns += router. urls4 写视图类from rest_framework. viewsets import ModelViewSetfrom . serializer import BookSerializerclass BookView ( ModelViewSet) : queryset = Book. objects. all ( ) serializer_class = BookSerializer5 写序列化类class BookSerializer ( serializers. ModelSerializer) : class Meta : model = Bookfields = "__all__"
表
class User ( models. Model) : username = models. CharField( max_length= 32 ) password = models. CharField( max_length= 32 ) class Book ( models. Model) : name = models. CharField( max_length= 64 ) price = models. IntegerField( )
五 路由转换器
转换器:path( 'books/<int: pk>' , BookView. as_view( ) ) ,