网站建设vi设计,东莞企业网站哪家强,网站长期建设 运营计划,wordpress 中字体插件一 Web开发模式
1. 前后端混合开发模式
前后端混合开发模式是一种开发方式#xff0c;将前端和后端的开发工作结合在一起#xff0c;以加快项目的开发速度和
提高协作效率。这种模式通常用于快速原型开发、小型项目或敏捷开发中。在前后端混合开发模式中#xff0c;前端和…一 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类型数据ak6E823f587c95f0148c19993539b99295region上海query肯德基outputjson-4.响应结果json或xml格式的数据-https://api.map.baidu.com/place/v2/search?ak6E823f587c95f0148c19993539b99295region%E4%B8%8A%E6%B5%B7query%E8%82%AF%E5%BE%B7%E5%9F%BAoutputjson-典型的api接口长这样-url地址-有请求方式-携带参数-返回格式是jsonxml-前端不同编码格式-urlencoded: body体中 usernamelqzpassword123 django的request.POST取出值-json body体中 {username:lqz,password:123} django的request.POST取不出值-form-databody中格式固定数据部分和文件部分--》request.POST能取出数据取不出文件文件都是从----------------------------789048583058585187025897\r\nContent-Disposition: form-data; nameusername\r\n\r\nlqz\r\n文件二进制-django中的文件对象和原来的文件对象-djangofrom 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/ # 不符合restful规范-https://127.0.0.1/api/v1/delete_books/# 不符合restful规范-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?limit10指定返回记录的数量https://api.example.com/v1/zoos?offset10指定返回记录的开始位置https://api.example.com/v1/zoos?page2per_page100指定第几页以及每页的记录数https://api.example.com/v1/zoos?sortbynameorderasc指定返回结果按照哪个属性排序以及排序顺序https://api.example.com/v1/zoos?animal_type_id1指定筛选条件-7 响应状态码(两层)-http响应状态码 1xx2xx3xx4xx5xxhttps://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返回资源对象的列表数组# [{name:西游记,price:19},{name:三国,price:19}]GET /collection/resource返回单个资源对象 # {name:三国,price:19}POST /collection返回新生成的资源对象# {name:三国,price:19}PUT /collection/resource返回完整的资源对象# {name:三国演绎,price:19}DELETE /collection/resource返回一个空文档# ---》大家都这么做{code:100msg:查询成功restult:[{name:西游记,price:19},{name:三国,price:19}]}-10 响应中带链接Hypermedia APIRESTful 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编写
########### book的接口写成CBV更好, 先用原生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() # 查询出来的是queryset对象不是列表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(namename, priceprice)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(pkpk)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(pkpk).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(pkpk).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最新 -django3.1.12-drf:3.14.02 在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):# char是定长varchar是可变长username models.CharField(max_length32)password models.CharField(max_length32)class Book(models.Model):name models.CharField(max_length64)price models.IntegerField()五 路由转换器
转换器# str,匹配除了路径分隔符/之外的非空字符串这是默认的形式# int,匹配正整数包含0。# slug,匹配字母、数字以及横杠、下划线组成的字符串。# uuid,匹配格式化的uuid如 075194d3-6885-417e-a8a8-6c931e272f00。# path,匹配任何非空字符串包含了路径分隔符/不能用path(books/int: pk, BookView.as_view()),