后端开发简介
后端开发介绍
1 . 前后端开发模式
xadmin
前端的后台管理模板,layui+jquery
admin-lte
前端的后台管理模板,bootstrap+jquery
# 前后端混合开发
-前端,后端都是一个人来完成
-自己写前端,调试
-自己写后端,调试
# 前后端分离
- 后端人员只负责写接口(API接口),可以使用postman等接口测试工具测试
- postman
下载网址:https://www.postman.com/downloads/?utm_source=postman-home
是一种常用的接口测试工具,相对于其它的接口测试工具,它是比较简单的一个接口测试工具
适用于开发人员、测试人员
开发:开发每个功能的接口后,都需要自己调试
测试:通过设置不同的参数去测试接口实现的是否正确
- 前端人员只负责写前端,写的过程中使用mock数据
- mock
mock的意思是模拟,就是在测试过程中,对于一些不容易构造和获取的对象,
用一个虚拟的对象来创建以便测试。
其中分为俩类
- 前端对接口的mock
- 后端单元测试中涉及的mock
mock测试是可控的方式模拟真实的对象行为,通常创造模拟对象来测试对象本身该具备的行为
通过代码制造假的输出“结果”
通过代码去模拟假的接口返回数据
- 最后:前后端联调项目
1.1 前后端不分离视图
1.2 前后端分离视图
2. API接口
# 通过网络,规定了前后台信息交互规则的url链接,也就是前后台信息交互的媒介
-- 前台系统:主要是指用于用户和客户操作的界面或者是手机app。
此类操作软件直接对外服务,是给用户看的,和一些业务受理等功能。
-- 后台系统:是内部管理、业务内部处理、以及内部资源配置等系统,这些都是属于企业内容的软件系统,仅对内使用,不对外开放。
# API接口的样子
- url:长得像返回数据的url链接
https://api.map.baidu.com/place/v2/search
- 请求方式:get、post、put、patch、delete
采用get方式请求上方接口
- 请求参数:json或xml格式的key,value类型数据
ak:6E823f587c95f0148c19993539b99295
region:上海
query:肯德基
output:json
响应结果:json或xml格式的数据
-响应结果:json或xml格式的数据
3. 接口测试工具postman
# API接口写好,后端人员要测试,不可能在浏览器里测试
# 使用postman软件,来做接口测试
- 其本质就是:模拟发送Http请求
# 接口测试软件有很多,postwoman
# 官网下载:https://www.postman.com/downloads/
# 双击点击安装即可,会自己安装好并创建到桌面上
4. restful规范
REST 全称是 Representational State Transfer,中文意思是表述:表征性状态转移,它首次出现在2000年Roy Fielding的博士论文中。
RESTful是一种定义Web API接口的设计风格,尤其适用于前后端分离的应用模式
restful规范有10点,(规范,公司都有自己的风格规范)
-
1. 数据的安全保障 url链接一般都是采用https协议进行传输, 也就是说为了保证数据的安全性使用https协议传输
-
2. 接口中带api关键词 https://api.map.baidu.com/place/v2/search https://baidu.com/api
-
3. 多数据版本共存 一个接口可能有多个版本,url链接中应该要有标识版本的标识 比如: 登录接口,最初只需要用户名和密码 https://baidu.com/api/login/v1 (v1标识着老版本) 但后期考虑到不安全又加,又写了一个登录接口,需要用用户名,密码,验证码 这个时候考虑到老用户也要使用不可能把之前的接口关掉,就在后加上标识区分。 https://baidu.com/api/login/v2 (v2标识着新版本)
-
4. 数据即资源,均使用名词(可用复数)》》》:接口尽量使用名词 都是用名词,没法区分是增加,删除,修改,查询
-
5. 资源操作由请求方式决定 --获取数据:get请求 --删除数据:delete请求 --新增数据:post请求 --修改数据:put或patch请求
-
6. url地址中带过滤参数 通过url后携带参数挨传递过滤条件 如: 获取动物园所有动物 127.0.0.1/api/v1/animals --->:get请求 获取动物园所有的爬行动物 127.0.0.1/api/v1/animals?type=爬行类 --->:get请求
-
7.响应带状态码 http状态码:http://tools.jb51.net/table/http_status_code --1xx:表示请求正在处理,一般看不到 100(Continue),继续。客户端应继续请求 101(Switching Protocols),切换协议。服务器根据客户端的请求切换协议,只能切换到更高的协议。 --2xx:表示请求处理成功 200(OK),请求成功,一般用于GET与POST请求 201(Created),已创建,成功请求并创建了新的资源 203(Non-Authoritative information),非授权信息,请求成功,但返回的meta信息不在原始的服务器,而是一个副本 204(No Content),无内容。服务器成功处理,但未返回内容,在未更新网页的情况下,可确保历览器继续显示当前文档 205、206、... --3xx:表示重定向到其它地址 300(Multiple Choices),多种选择,请求的资源可包括多个位置,相应可返回一个资源特征与地址的列表用于用户终端 301(mOVED Permanently),永久移动。请求的资源已被永久的移动到了新的URL,返回的信息会包括新的URL,后浏览器会自动定向到新的URL 今后任何新的请求都应使用新的URL代替 302(Found),临时移动。与301类是,但资源只是临时被移动,客户端应继续使用原有的URL 303(see Other),查看其它地址,与301类是,使用GET与POST请求查看 304、305、... --4xx:客服端错误 400(Bad Request),客户端请求的语法错误,服务端无法识别。 401(Unauthorized),请求要求用户的身份证 402(Payment Required),保留。将来使用 403(Forbidden),客户端无权访问。服务器理解请求客户端的请求,但是拒绝执行此请求。 404(Not Found),请求资源不存在。服务器无法根据客户端的请求找到资源。通过此代码,网站设计人员可设置"您所请求的资源无法找到"的个性页面 405、406、... --5xx:服务端错误 500(Internal Server Error),服务器内部出错。无法完成请求 501(Not Implemented),服务器不支持请求的功能,无法完成请求 502(Bad Gateway),充当网关或代理的服务器,从远端服务器接收到了一个无效的请求 503(Service Unavailable),由于超载或系统维护,服务器暂时无法处理客户端的请求,延时的长度可包含在服务器的Retry-After头信息中 504、505、... 自定义响应状态码 有的公司会有增加规定制作的响应状态码标识错误,并写在响应体中。 如:{code:100}
-
8.返回错误信息---> 响应体中带错误信息 {code:100,msg:成功}
-
9.返回结果,针对不同操作,服务器向用户返回的结果用改符合以下规范 -- GET/collection:返回资源对象的列表/数组--->[{},{}] 获取多条:---> {code:100,msg:成功,data[{name:论软饭硬吃,price:999.99,author:老刘},{name:富婆通讯录,price:888.88,author:老刘}]} -- GET/collection/resource:返回单个资源对象--->{} 获取单条:--->{code:100,msg:成功,data:{name:论软饭硬吃,price:999.99,author:老刘}} -- POST/collection:返回新生成的资源对象--->{} 新增数据:--->{code:msg:新增成功,data:{name:如何俘获富婆芳心,price:999.99,author:老刘}} -- PUT/collection/resource:返回完整的资源对象--->{} -- PATCH/collection/resource:返回完整的资源对象--->{} 修改数据:--->{code:100,msg:修改成功,data:{name:富婆通讯录加强版,price:1888.88,author:老刘}} -- DELETE/collection/resource:返回完整的资源对象--->{} 删除数据:--->{code:100,msg:删除成功}
-
10.响应中带链接 如下: { "comments": [ { "created_at": "Wed Jun 01 00:50:25 +0800 2011", "id": 12438492184, "text": "love your work.......", "source": "<a href="http://weibo.com" rel="nofollow">新浪微博</a>", "mid": "202110601896455629", "user": { "id": 1404376560, "screen_name": "zaku", "name": "zaku", "province": "11", "city": "5", "location": "北京 朝阳区", "description": "人生五十年,乃如梦如幻;有生斯有死,壮士复何憾。", "url": "http://blog.sina.com.cn/zaku",# 链接 "profile_image_url": "http://tp1.sinaimg.cn/1404376560/50/0/1", "domain": "zaku", "gender": "m",
5. 序列化与反序列化
# API接口开发,最核心最常见的一个过程就是序列化,所谓序列化就是把数据转换格式,序列化可以分为俩个阶段
-- 序列化:把我们识别的数据转换成指定的格式提供给别人
-- 反序列化:把别人提供的数据转换,还原成我们需要的格式
-- 列如:我们在django中获取到的数据默认都是模型对象(queryset),但是模型对象数据无法直接提供给前端使用
这个时候我们就需要使用序列化,转化成Json格式的数据,提供给前端,然后前端通过反序列化转换成前端能够识别的数据使用。
6. Djangorest framework快速使用
# 使用Django这个Web框架,开发前后端分离项目(模板渲染),只写接口
-- 使用JsonResPonse返回也可以完成--->原生Django
--Djangorestframework方便快速写出符合restful规范的接口简称(DRF)
# 写接口:总共就5个及5个的变形
-获取所有:GET
-获取单条:GET
-新增一条:POST
-修改一条:PUT/PATCH
-删除一条:DELETE
# DRF属于一个第三方插件需要在pip库内下载
# 安装DRF
pip3.8 install djangorestframework
6.1 urls.py
from django.urls import path
from rest_framework.routers import SimpleRouter
from app01 import views
router = SimpleRouter()
router.register('books', views.BookView)
urlpatterns = [
path('admin/', admin.site.urls),
]
urlpatterns += router.urls
6.2 views.py
from django.shortcuts import render
# Create your views here.
from .models import Book
from rest_framework.viewsets import ModelViewSet
from .serializer import BookSerializer
class BookView(ModelViewSet):
queryset = Book.objects.all()
serializer_class = BookSerial
6.3 models.py
from django.db import models
# Create your models here.
class Book(models.Model):
title = models.CharField(max_length=32)
6.4 serializer.py
from rest_framework import serializers
from .models import Book
class BookSerializer(serializers.ModelSerializer):
class Meta:
model = Book
fields = "__all__"
7. CBV源码分析
# cbv写好后,路由配置如下
-第一个参数是路径,第二个参数是试图函数的内存地址(视图类执行as_view这个类方法,把它执行完,结果放在第二个参数上:我们猜执行完的结果是个函数内存地址)
path('test/', views.TestView.as_view()),
-去找as_view,去TestView类中找,找不到,没有,去父类中找View
@classonlymethod
def as_view(cls, **initkwargs):
def view(request, *args, **kwargs):
return self.dispatch(request, *args, **kwargs)
return view
-当请求来了,路由匹配成功,会执行view(request)--->本质执行self.dispatch(request, *args, **kwargs)
-去View中找到了dispatch
def dispatch(self, request, *args, **kwargs):
# 请求方式转成小写,假设 get 请求,符合if条件
if request.method.lower() in self.http_method_names:
# 反射 getattr(对象,'字符串','默认值')
# self是TestView的对象
# handler 就是TestView类的get方法
handler = getattr(self, 'get', self.http_method_not_allowed)
else:
handler = self.http_method_not_allowed
return handler(request, *args, **kwargs) # get(request)
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通