前后端开发模式

1.前后端结合模式----全栈
  后端人员根据前端写好的静态html页面 套用模板语法
  存在问题:前端页面嵌入了很多后端代码 一旦后续更换语言 前端可能要重新写 增大成本
2.前后端分离模式
  前端:前端人员负责写前端 使用mock数据
  后端:后端人员写(API接口) 使用postman接口测试工具测试
  前后端数据进行联调项目
  2.1 客户端和服务端采用RESTFUL API的交互方式进行交互
  2.2 前后端代码库分离
  2.3 并行开发
3.前后端分离优点:
  提升开发效率
  完美应对复杂多变的前端需求
  增强代码的可维护性
  为优质产品打造精益团队

API接口

1.API接口:通过网络 规定了前后台信息交互规则的url链接(前后台信息交互的媒介)
2.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格式的数据 

接口测试工具postman

1.原因:后端人员将API接口写好后 需要测试 无法在浏览器中进行测试 需要借助测试软件
2.种类:测试软件很有多 如 postman、postwoman、PAW-Mac、PAW、SoapUI、Katalon Studio、JMeter、Karter DSL
3.本质:模拟发送http请求
4.postman官方网址:https://www.postman.com/downloads/

restful规范

1.REST:全称 Representational State Transfer(表征性状态转移) 2000年首次出现在Roy Fielding
2.RESful:定义Web API接口的设计风格 尤其使用于前后端分离的应用模式种
3.RESful规范:
  3.1 数据的安全保障:url链接一般采用https协议进行传输(https=http+ssl/tsl(http协议的基础上通过传输加密和身份认证))
  3.2 接口中带api关键词
  3.3 多数据版本数据共存 一个接口可能有多个版本 url链接中标识版本
      如 版本的更新(旧版本也需要存在)
  3.4 数据(即资源):均使用名词(可使用复数) 接口尽量使用名词
  3.5 资源操作由请求方式决定
      获取数据:get请求
      删除数据:delete请求
      新增数据:post请求
      修改数据:put patch请求
      注:请求地址一样 通过请求方式决定对资源进行什么操作
  3.6 url地址中带过滤参数
  3.7 响应状态码
      http状态码:
            1xx:请求正在处理
                 100 继续
                 101 切换协议
            2xx:请求 处理成功
                 200 请求成功
                 201 已创建
            3xx:重定向
                 301 永久移动
                 302 临时移动
            4xx:客户端错误
            	 403 服务器理解请求 但拒绝(缺携带的标志数据)
                 404 查询的资源不存在
            5xx:服务端错误
            	 500 服务器内部错误
                  501 服务器不支持请求的功能
        网址:http://tools.jb51.net/table/http_status_code
      响应体中写状态码:公司规定 如在响应体中写状态码{code:100}
   3.8 返回错误信息:响应体中携带错误信息{code:100,msg:成功}
   3.9 返回结果 针对不同操作 服务器向用户返回的结果应该符合以下规范
       GET/collection:返回资源对象的列表(数组)[{},{}]
       GET/collection/resource:返回单个资源对象{}
       POST/collection:返回新生成的资源对象{}
       PUT/collection/resource:返回完整的资源对象
       PATCH/collection/resource:返回完整的资源对象{}
       DELETE/collection/resource:返回一个空文档
      数据获取类型:获取所有
        		  获取单条
                   新增数据
                   修改数据
                   删除数据
   3.10 响应中带链接    

序列化和反序列化

1.序列化:我们识别数据转换为指定的格式提供给别人
2.反序列化:将别人提供的数据转化为我们所需的数据格式

djangorestframework快速使用

1.使用django这个web框架 开发前后端分离项目(模板渲染) 写接口
  1.1 JsonResponse返回
  1.2 djangorestframewor可以快速写出符合的restful规范的接口
2.接口数据处理
  2.1 获取所有:get     http://127.0.0.1:8000/books
  2.2 获取单个:get	   http://127.0.0.1:8000/books/1
  2.3 新增一条:post     http://127.0.0.1:8000/books/(最后必须加/)
  2.4 修改一条:put/patch  http://127.0.0.1:8000/books/1
  2.5 删除一条:delete     http://127.0.0.1:8000/books/1
3.第三方:安装 pip3 install djangorestframework
4.代码操作:books表数据的增删改查
urls.py
    from django.urls import path
    from app01 import views
    from rest_framework.routers import SimpleRouter
    router = SimpleRouter()
    router.register('books', views.BookView)
    urlpatterns = [
        path('admin/', admin.site.urls),
    ]
    urlpatterns += router.urls
views.py
    from app01 import models
    from rest_framework.viewsets import ModelViewSet
    from app01 import serializer

    class BookView(ModelViewSet):
        queryset = models.Books.objects.all()
        serializer_class = serializer.BookSerializer
 models.py
    from django.db import models

    class Books(models.Model):
        name = models.CharField(max_length=32)
        price = models.CharField(max_length=32)
        publish = models.CharField(max_length=32)
 serializers.py
    from rest_framework import serializers
    from app01 import models

    class BookSerializer(serializers.ModelSerializer):
        class Meta:
            model = models.Books
            fields = '__all__'

cbv源码分析

1.路由匹配:
  第一个参数:路径 
  第二个参数:视图函数的内存地址(执行as_view类方法 执行完后是函数的内存地址)
    urlpatterns = [
        path('test/', views.TestView.as_view())
    ]
2.写基于类的视图(cbv):
  from django.views import View
  class TestView(View):
    def get(self, request):
        return HttpResponse('1234')
3.查找类的as_view方法
  先从TestView类中查找  无
  从继承的父类View中查找(as_view是绑定给类的方法) 
  @classonlymethod
    def as_view(cls, **initkwargs):
        def view(request, *args, **kwargs):
            return self.dispatch(request, *args, **kwargs)
        return view
4.发送请求 路由匹配成功 执行view(request)
  执行dispatch方法
  先从TestView类中查找  无
  从继承的父类View中查找(dispatch方法)
   def dispatch(self, request, *args, **kwargs):
        if request.method.lower() in self.http_method_names:
            handler = getattr(self, request.method.lower(), self.http_method_not_allowed)
        else:
            handler = self.http_method_not_allowed
        return handler(request, *args, **kwargs)
 5.request.method.lower()获取请求类型转换为小写 再判断在不在请求类型的数据中
   通过反射getattr方法获取
   根据请求类型 查找方法 执行
   如get请求
     class TestView(View):
        def get(self, request):
            return HttpResponse('1234')
 posted on 2022-09-23 20:23  拾荒菇凉  阅读(79)  评论(0)    收藏  举报