Django之数据接口开发

本文详细介绍了使用Django开发RESTful API的过程,包括REST架构的介绍、HTTP动词和状态码的理解,以及接口设计的各个方面。重点讲解了基于类的视图(CBV)来开发数据接口,如分页、缓存、筛选排序和限流的实现方法。内容涵盖CBV的使用、序列化器定义、URL映射以及各种功能的定制。
摘要由CSDN通过智能技术生成

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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值