内容概览
- 前后端开发模式
- API接口
- 接口测试工具postman
- restful规范
- 序列化与反序列化
- djangorestframework快速使用
- CBV源码分析
前后端开发模式
- 前后端混合开发
在后端通过前端写好的html页面,使用模板语法渲染出页面然后返回给前端展示 - 前后端分离开发
前端先请求到静态页面,需要数据向后端发送请求,后端将前端需要的数据返回(json/xml);
前端只负责写前端,写的过程中使用mock数据。后端只负责写后端(API接口),使用接口测试工具测试(postman)
最后前后端联调项目
API接口
API(Application Programming Interface)开发接口标准之一:通过网络,规定了前后台信息交互规则的url链接,也就是前后台信息交互的媒介
- 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格式的数据
- url:长得像返回数据的url链接
接口测试工具postman
后端写完接口后,不可能在浏览器中测试,需要使用测试软件来做接口测试
实际上就是模拟发送http请求
restful规范
REST全称是Representational State Transfer,中文意思是表述:表征性状态转移
RESTful是一种定义Web API接口的设计风格,尤其适用于前后端分离的应用模式中
restful的规范有十条:
- 数据的安全保障:url链接一般采用HTTPS协议传输
- 接口中带有api关键字
- 多版本数据共存,一个接口可能有多个版本,在url中携带版本标识
- 数据既资源,均使用名词(可以使用复数)
- 相同的地址,资源的操作方式由请求方式决定
get:获取数据
post:新增数据
delet:删除数据
put/patch:修改数据 - url地址中带过滤参数
获取书店中所有书籍:127.0.0.1/api/v1/books
获取书店中所有教材类书籍:127.0.0.1/api/v1/books?type=textbook - 响应带状态码,在响应体中携带状态码,通过数字来代表一段信息
http状态码:
1xx:请求正在处理
2xx:请求处理成功
3xx:重定向
4xx:客户端错误
5xx:服务端错误
公司可能会有自己规定的响应状态码 - 返回错误信息,在响应体中携带错误信息
- 返回结果,针对不同操作,服务器向用户返回的结果应该符合一下规范(现在一般不会完全符合该规范)
GET /collection:返回资源对象的列表(数组)[{},{}]
GET /collection/resource:返回单个资源对象 {}
POST /collection:返回新生成的资源对象 {}
PUT /collection/resource:返回完整的资源对象 {}
PATCH /collection/resource:返回完整的资源对象 {}
DELETE /collection/resource:返回一个空文档 - 响应中带链接
序列化和反序列化
api接口开发,最核心最常见的一个过程就是序列化,所谓序列化就是把数据转换格式
序列化:将我们能够识别的数据转换成其他语言能够识别的数据格式提供
反序列化:将别人序列化过后的的数据转换成我们所需要的格式
djangorestframework快速使用
-
使用django框架,开发前后端分离项目:
原生django,使用JsonResponse返回数据即可
使用djangorestframework可以快速的写出符合restful规范的接口 -
接口总共就只有5个以及这5个的变形
获取所有:get
获取单个:get
新增一个:post
修改一个:put/patch
删除一个:delete -
对于book表,使用drf快速实现这5个接口
先安装drf:pip install Djangorestframework
urls.py
from django.contrib import admin
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
views.py
from .models import Book
from rest_framework.viewsets import ModelViewSet
from .serializer import BookSerializer
class BookView(ModelViewSet):
queryset = Book.objects.all()
serializer_class = BookSerializer
models.py
from django.db import models
class Book(models.Model):
name = models.CharField(max_length=32)
price = models.CharField(max_length=32)
publish = models.CharField(max_length=32)
serializer.py
from rest_framework import serializers
from .models import Book
class BookSerializer(serializers.ModelSerializer):
class Meta:
model = Book
fields = '__all__'
通过postman测试
CBV源码分析
"""cbv写好后,在路由中配置"""
path('test/', views.TestView.as_view())
"""会先执行as_view这个方法,按照查找顺序一层层查找该方法"""
@classonlymethod
def as_view(cls, **initkwargs):
def view(request, *args, **kwargs):
return self.dispatch(request, *args, **kwargs)
return view
"""在父类中找到as_view方法,方法中定义了一个函数并返回,在路由匹配成功后执行此函数"""
"""在View中找到dispatch方法"""
def dispatch(self, request, *args, **kwargs):
if request.method.lower() in self.http_method_names: # 将请求方式转成小写,判断是否在后者的列表中;
"""http_method_names = [
"get","post","put","patch",
"delete","head","options","trace",
]"""
handler = getattr(self, request.method.lower(), self.http_method_not_allowed) # 通过反射获取到请求方式对应的方法
else:
handler = self.http_method_not_allowed
return handler(request, *args, **kwargs) # 返回该方法的返回值