文章目录
1.REST
REST介绍
REST与技术无关,代表的仅仅是一种架构,一种风格。他的全称为REpresentational State Transfer,意为"表述性信息转移"。
网络API:主要是强调是通过HTTP(s)请求来请求一个URL获得(json)数据。
普遍认为,在设计网络接口的时候设计成RESTful API被认为是最好的选择
REST的作者认为:REST是最适合互联网应用的架构。凭什么REST的作者就有勇气认为REST是最适合互联网应用的架构呢?首先HTTP是无状态无连接的,REST架构强调两个词无状态、幂等性。它提出,URL的设计必须使用名词而不能使用动词,我们要用HTTP的动词来表示我们需要做什么操作,因为HTTP的动词已经足够我们进行各种各样的操作。
幂等性强调的是水平扩展
- 互联网应用都会面临高并发,所以我们一般都会对系统进行水平扩展:单机结构变多机结构(分布式集群)
HTTP的动词
GET 从服务器取出资源
POST 向服务器添加资源(不需要幂等性)
DELETE 从服务器删除资源
PUT 更新服务器资源(客户端提供改变后的完整资源)
PATCH 更新服务器资源(客户端提供改变的属性)
状态码
200 OK - [GET]:服务器成功返回用户请求的数据,该操作是幂等的(Idempotent)。
201 CREATED - [POST/PUT/PATCH]:用户新建或修改数据成功。
202 Accepted - [*]:表示一个请求已经进入后台排队(异步任务)
204 NO CONTENT - [DELETE]:用户删除数据成功。
400 INVALID REQUEST - [POST/PUT/PATCH]:用户发出的请求有错误,服务器没有进行新建或修改数据的操作,该操作是幂等的。
401 Unauthorized - [*]:表示用户没有权限(令牌、用户名、密码错误)。
403 Forbidden - [*] 表示用户得到授权(与401错误相对),但是访问是被禁止的。
404 NOT FOUND - [*]:用户发出的请求针对的是不存在的记录,服务器没有进行操作,该操作是幂等的。
406 Not Acceptable - [GET]:用户请求的格式不可得(比如用户请求JSON格式,但是只有XML格式)。
410 Gone -[GET]:用户请求的资源被永久删除,且不会再得到的。
422 Unprocesable entity - [POST/PUT/PATCH] 当创建一个对象时,发生一个验证错误。
500 INTERNAL SERVER ERROR - [*]:服务器发生错误,用户将无法判断发出的请求是否成功。
2.接口设计开发
- 我们在做数据接口的时候要围绕实体设计,不要围绕业务设计。
做数据接口我们需要安装三方(djangorestframework)
pip install djangorestframework
我们需要在settings.py注册我们的
INSTALLED_APPS = [
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
# 注册djangorestframework
'rest_framework',
]
基于函数的视图(FBV)
1)Views视图
# 只接受get请求
@api_view(('GET', ))
def get_peovinces(request):
"""获取省级行政区域"""
# 获取数据库字段为空的数据(指定获取 distid, name) 字段
queryset = District.objects.filter(pid__isnull=True).only('distid', 'name')
# 对数据进行序列化(加many=True序列化出来是列表,不加就是字典)
serializer = DistrictSimpleSerializer(queryset, many=True)
return Response(serializer.data)
2)定义序列化器
- 在当前的apps下新建一个serializer.py,专门用来定义我们的序列化器类
- 创建一个DistrictSimpleSerializer类
class DistrictSimpleSerializer(serializers.ModelSerializer):
"""创建序列化器"""
class Meta:
# 指定序列化哪个model(表名)
model = District
# fields:需要保留的字段
fields = ('distid', 'name')
3).映射URL
urlpatterns = [
path('districts/', get_peovinces),
]
基于类的视图(CBV)
我们在写接口类的时候需要继承父类,下面列几个父类
ListAPIView 查询多个
RetrieveAPIView 查询单个
CreateAPIView 新增数据
DestroyAPIView 删除数据
RetrieveUpdateDestroyAPIView 拿单个/删除/更新
查询接口:定制需要查询字段
1)Views
class EstateView(ListAPIView):
"""获取楼盘信息"""
queryset = District.objects.all().only('district', 'agents')
# 用哪个类来序列化楼盘
serializer_class = EstateSerializer
2)定义序列化器
- 在当前的apps下新建一个serializer.py文件,专门用来定义我们的序列化器类
- 定义一个EstateSerializer类
class EstateSerializer(serializers.ModelSerializer):
class Meta:
model = Estate
exclude = ('district', 'agents')
3).映射URL
urlpatterns = [
path