Web开发模式、API接口、restful规范、序列化和反序列化、drf安装和快速使用、路由转换器(复习)

news2024/11/19 17:32:09

一 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/ # 不符合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?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
    	-404403405
        -301302
        -1xx表示请求正在处理---》前端一般看不到
        -2xx 表示请求处理成功--》经常看到
        	-201200有什么区别
        -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: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编写:
########### 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 Book


class 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(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 = name
        book.price = price
        book.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.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__"

class User(models.Model):
    # char是定长,varchar是可变长
    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()

五 路由转换器

转换器:
    # str,匹配除了路径分隔符(/)之外的非空字符串,这是默认的形式
    # int,匹配正整数,包含0。
    # slug,匹配字母、数字以及横杠、下划线组成的字符串。
    # uuid,匹配格式化的uuid,如 075194d3-6885-417e-a8a8-6c931e272f00。
    # path,匹配任何非空字符串,包含了路径分隔符(/)(不能用?)
    path('books/<int: pk>', BookView.as_view()),

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/946032.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

得物推荐引擎 - DGraph

1 前言 随着得物业务规模的不断增加&#xff0c;推荐业务也越来越复杂&#xff0c;对推荐系统也提出了更高的要求。我们于2022年下半年启动了DGraph的研发&#xff0c;DGraph是一个C项目&#xff0c;目标是打造一个高效易用的推荐引擎。推荐场景的特点是表多、数据更新频繁、单…

CSS 滚动容器与固定 Tabbar 自适应的几种方式

问题 容器高度使用 px 定高时&#xff0c;随着页面高度发生变化&#xff0c;组件展示的数量不能最大化的铺满&#xff0c;导致出现底部留白。容器高度使用 vw 定高时&#xff0c;随着页面宽度发生变化&#xff0c;组件展示的数量不能最大化的铺满&#xff0c;导致出现底部留白…

基于PID优化和矢量控制装置的四旋翼无人机(MatlabSimulink实现)

&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密&#xff0c;逻辑清晰&#xff0c;为了方便读者。 ⛳️座右铭&a…

C语言每日一练------(Day3)

本专栏为c语言练习专栏&#xff0c;适合刚刚学完c语言的初学者。本专栏每天会不定时更新&#xff0c;通过每天练习&#xff0c;进一步对c语言的重难点知识进行更深入的学习。 今天练习题的关键字&#xff1a; 尼科彻斯定理 等差数列 &#x1f493;博主csdn个人主页&#xff1a…

麒麟信安受邀参展第八届成都智博会,自主创新系列成果备受关注!

图片来源&#xff1a;人民网 日前&#xff0c;由四川省贸促会和四川省科学技术协会主办&#xff0c;中国国际商会与四川省互联网信息办公室、四川省密码管理局等18个省市相关部门支持的第八届中国&#xff08;成都&#xff09;智慧产业国际博览会&#xff08;以下简称“第八届成…

深度|沃尔玛眼中只有盒马,但盒马Fudi眼中却没有山姆

外资会员制超市是懂中国消费者的&#xff0c;尤其是懂4亿中国中产。 前有Costco&#xff08;开市客&#xff09;中国大陆首店上海开业当天&#xff0c;曾投放5吨10000瓶飞天茅台&#xff0c;还有Burberry、爱马仕等奢侈品直接被消费者瞬间秒空&#xff0c;最后由于慕名而来的人…

如何实现个人微信的自动回复?

自动回复这块&#xff0c;我知道的实现方法和形式有以下几种&#xff1a; 1.自动通过好友&#xff1a;针对有新的好友申请的时候&#xff0c;会自动通过好友&#xff0c;以免错过客户。 2.通过好友自动回复&#xff1a;针对被动通过好友后&#xff0c;自动给通过的微信好友发送…

ospf不规则区域划分和数据库表

华子目录 ospf不规则区域1.远离骨干的非骨干区域2.不连续骨干 不规则区域解决方案1.tunnel-点到点GRE2.ospf虚链路3.多进程双向重发布&#xff08;推荐&#xff09; ospf的数据库表 ospf不规则区域 1.远离骨干的非骨干区域 图示 2.不连续骨干 图示 不规则区域解决方案 …

Geodetector 应用excel显示宏损坏的解决办法

打开地理探测器 如果显示宏损坏&#xff0c;每次excel会自动删除文件中的宏文件&#xff0c;导致地理探测器不能运行&#xff0c;这样的解决办法主要是&#xff1a;修改电脑本身格式与excel宏文件运行格式一致&#xff1a; 区域格式改为中文&#xff0c;这样就可以运行了。

如何选择科研可视化的图表?(超全!总结10多个可视化代码资源)

Highlights 一张漂亮的配图能让论文增色不少&#xff0c;但现在的图表类型越来越丰富&#xff0c;学者们很难选择合适的绘图类型进行可视化。 随着大数据和云计算的发展&#xff0c;我们很容易就能获取大量的数据&#xff0c;但是将这些数据美观地展示出来不是一件容易的事情。…

Javaweb基础学习(4)

Javaweb基础学习&#xff08;4&#xff09; 一、JSP学习1.1 JSP的简介概述1.2 JSP快速入门1.3 JSP原理1.4 JSP脚本1.5 JSP缺点1.6 EL表达式1.7 JSL标签1.7.1 JSL快速入门 1.8 MVC 模式和三层架构1.9 三层架构 三、会话跟踪技术3.1 会话跟踪技术介绍3.2 Cookie的基本使用3.3、Co…

分布式集群框架——有关zookeeper的面试考点

3.掌握Zookeeper的概念 当涉及到大规模分布式系统的协调和管理时&#xff0c;Zookeeper是一个非常重要的工具。 1. 分布式协调服务&#xff1a;Zookeeper是一个分布式协调服务&#xff0c;它提供了一个高可用和高性能的环境&#xff0c;用于协调和同步分布式系统中的各个节点…

输入设备应用编程

目录 输入类设备编程介绍什么是输入设备input 子系统读取数据的流程应用程序如何解析数据 读取struct input_event 数据在开发板上验证按键应用编程触摸屏应用编程解析触摸屏设备上报的数据获取触摸屏的信息单点触摸应用程序多点触摸应用程序 鼠标应用编程 本章学习输入设备的应…

私域流量的本质是什么?

私域流量的本质可以总结为以下几点&#xff1a; ①用户拥有权: 私域流量的关键是企业拥有对用户数据和互动的掌控权 ②长期价值: 建立持久的、互惠的关系&#xff0c;以便长期吸引、留住客户&#xff0c;并不断提高他们的价值。这与公域流量通常更侧重于短期转化的特性不同。…

华为加速回归Mate 60发布, 7nm全自研工艺芯片

华为于今天12:08推出“HUAWEI Mate 60 Pro先锋计划”&#xff0c;让部分消费者提前体验。在华为商城看到&#xff0c;华为Mate 60 pro手机已上架&#xff0c;售价6999元&#xff0c;提供雅川青、白沙银、南糯紫、雅丹黑四种配色供选择。 据介绍&#xff0c;华为在卫星通信领域…

玉米叶病害识别(图像连续识别和视频识别,python代码,pytorch框架)

代码运行要求&#xff1a;Torch>1.13.1即可 效果视频玉米叶病害识别&#xff08;图像连续识别和视频识别,python代码&#xff0c;pytorch框架&#xff09;_哔哩哔哩_bilibili 1.数据集介绍&#xff1a; Blight(枯萎病),1145张照片 Common_Rust&#xff08;褐锈病&#xff0…

C语言二——sqrt函数

sqrt 是C语言中的一个数学函数&#xff0c;用于计算平方根。它的函数原型如下&#xff1a; double sqrt(double x); sqrt 函数接受一个浮点数参数 x&#xff0c;并返回 x 的平方根&#xff0c;结果也为浮点数类型。 这段代码计算了一个数字的平方根并输出结果。具体而言&#…

Android.mk开发模板

今天简单写了一个 Android.mk 的示例模板&#xff0c;供初学者参考。 本模板主要给大家示例 Android NDK 开发中的如下几个问题&#xff1a; 如何自动添加需要编译的源文件列表如何添加第三方静态库、动态库的依赖如何构造一个完整的NDK工程框架 假设我们的项目依赖 libmath.…

元宇宙头像NFT生成免费教程,打造专属数字身份!

随着元宇宙的蓬勃发展&#xff0c;独特的像素风元宇宙 NFT 头像深受广大玩家和收藏者的喜爱。这些头像各具特色&#xff0c;是展示个性的绝佳方式。如果你也想拥有这样酷炫的头像&#xff0c;但苦于没有设计功底&#xff0c;那么可以试试在线设计工具即时设计。今天我们就来看看…

基于龙格-库塔算法优化的BP神经网络(预测应用) - 附代码

基于龙格-库塔算法优化的BP神经网络&#xff08;预测应用&#xff09; - 附代码 文章目录 基于龙格-库塔算法优化的BP神经网络&#xff08;预测应用&#xff09; - 附代码1.数据介绍2.龙格-库塔优化BP神经网络2.1 BP神经网络参数设置2.2 龙格-库塔算法应用 4.测试结果&#xff…