前后端开发模式
1.前后端混合
前端写好静态html页面,后端使用模板语法进行渲染,然后在在对接,遇到问题返回给前端进行修改,这要求后端人员会一些HTML、JS等前端语言,这种模式让前后端开发的进度互相响应,对后端人员的要求也更高
2.前后端分离
-随着外部开发(pc端、移动端),开始流行前后端分离开发
-后端只需要负责接口(API接口),使用postman接口测试工具测试
-前端人员只需要负责写前端,使用mock数据模拟测试
-出问题后,前端问题改前端,后端问题改后端,这样开发效率必然有所提升
API接口
1.API全称为应用程序编程接口,规定了前后端信息交互规则的url连接,也就是所有的客户端和消费端都通过统一的网关接入微服务
2.API接口的样子
2.1url:看起来像数据的url链接
https://api.map.baidu.com/place/v2/search
2.2请求方式:
get(获取数据)、post(新增数据)、put(修改数据)、patch(修改数据)、delete(删除数据)
eg:使用上方接口就是get方式请求
2.3请求参数:参数可以是json或xml格式的key-value类型数据
?ak=6E823f587c95f0148c19993539b99295®ion=上海&query=肯德基&output=json
eg:使用上方接口就是get方式请求,这个接口需要在后面携带上面的参数
2.4响应结果:可能json或xml格式的数据
接口测试工具
1.API接口写好后,后端人员要自行测试,不可能在浏览器里测试,可以使用postman软件来做接口测试,postman软件时通过模拟http请求来测试
'接口测试软件有很多,如:postwoman'
2.下载官网:https://www.postman.com/downloads/
restful规范
-REST全称Representational State Transfer,是描述了框架样式的网络系统,它首次出现在2000年Roy Fielding的博士论文中,REST并没有明确的标准,而更像是一种设计风格
'REST规范有10点,不过每个公司都有自己的风格规范'
1.数据的安全保障
https比http更安全,所以为了保证数据的安全,url链接尽量使用HTTPS协议来进行传输
-HTTPS:http+ssl/tsl
2.接口中带api关键词
带api关键词代表着是链接接口的的请求
3.多数据版本共存
一个接口可以有多个版本,url链接中标识版本
如应用的版本更新后,升级了新的接口,但有些用户并没有更新,所以我们在更新接口是会重新写一个接口,这样没更新的用户就可以通过版本标识使用旧接口
4.数据即是资源,均使用名词(可使用负数)
接口尽量使用名词
5.资源操作由请求方式决定
请求地址都一样,通过请求方式决定对资源进行操作
get>>>获取数据
post>>>新增数据
put、patch>>>修改数据
delete>>>删除数据
6.url地址中带过滤参数
-获取所有动物>>>127.0.0.1/api/v1/animals
-获取所有哺乳类动物>>>127.0.0.1/api/v1/animals?type=哺乳类
7.响应状态码
http状态码:
-1xx:表示请求正在处理,一般是看不到的
-2xx:表示请求成功
200:成功处理请求
201:请求成功
-3xx:重定向
301:永久重定向
302:临时重定向
-4xx:客户端错误
403:拒绝请求
404:不存在
-5xx:服务端错误
-有些公司有规范,在响应体中写状态码
{'code': 100}
8.返回错误信息
响应体中带成功或错误信息
{'code': 100, 'msg': '成功'}
9.返回结果,针对不同操作,服务器向用户返回的结果应该符合以下规范
-restful规范
GET:/collection:返回资源对象的列表(数组)>>>[{},{}]
GET:/collection/resource:返回单个资源对象>>>{}
POST:/collection:返回新增的资源对象>>>{}
PUT:/collection/resource:返回修改后的资源对象>>>{}
PATCH:/collection/resource:返回修改后的资源对象>>>{}
DELETE:/collection/resource:返回一个空文档
-不过也有人
获取所有:{'code': 100, 'msg': '获取成功', date: [{}, {}]}
获取单条:{'code': 100, 'msg': '获取成功', date: [{}]}
新增数据:{'code': 100, 'msg': '新增成功', date: [{}]}
修改数据:{'code': 100, 'msg': '修改成功', date: [{}]}
删除数据:{'code': 100, 'msg': '删除成功'}
10.响应中带链接
序列化和反序列化
1.在api接口开发中,最常见的过程就是序列化,序列化就是把数据转换成其他格式
2.序列化:把我们识别的数据转换为指定的格式
3.反序列化:把别人提供的数据转换成我们需要的格式
djangorestframework快速使用
1.使用django这个web框架,开发前后端分离项目,只需要写接口
原生django:使用JsonResponse返回
djangorestframework:可以方便我们快速写出符合restful规范的接口
2.djangorestframework写接口总共5个及这5个的变形
获取所有>>>get
获取单个>>>get
新增一条>>>post
修改一条>>>put/patch
删除一条>>>delete
3.下面建立Book表尝试drf操作
models.py
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__'
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
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
cbv源码分析
1.cbv写好后路由配置
第一个是匹配的路径,第二个参数是视图函数的内存地址(视图函数执行as_view()类方法,把他执行后的结果放在第二个参数上,所有执行完的结果应该是个函数内存地址)
path('set/', views.TesView.as_view())
2.去找as_view,在TesView中没有找到,在去父类View中找
@classonlymethod # 将方法装饰成类
def as_view(cls, **initkwargs):
def view(request, *args, **kwargs):
return self.dispatch(request, *args, **kwargs)
return view # 返回函数的内存地址
3.当请求来时,路由匹配成功会执行views.TesView()(request)>>>view(request)
本质是执行了self.dispatch(request, *args, **kwargs),去View中找dispatch
def dispatch(self, request, *args, **kwargs):
# 请求方式转成小写,判断是否在http_method_names中
if request.method.lower() in self.http_method_names:
# 去self对象找request.method.lower(),找打则返回这个方法,没找到则返回self.http_method_not_allowed
handler = getattr(
# handler是TesView类的get方法
self, request.method.lower(),
# self是TesView的对象
self.http_method_not_allowed
)
else:
handler = self.http_method_not_allowed
# 执行get(request)
return handler(request, *args, **kwargs)
'''
也就是说cbv本质上,如果是get请求它就会执行get,如果你是post请求它就会执行post
'''
标签:请求,get,self,request,接口,API,import,drf
From: https://www.cnblogs.com/riuqi/p/16724211.html