首页 > 其他分享 >drf-restful规范

drf-restful规范

时间:2023-08-29 21:13:57浏览次数:39  
标签:name com request 规范 api https restful book drf

RESTful API规范

简介:
	REST全称是Representational State Transfer,中文意思是表述(编者注:通常译为表征性状态转移)。 它首次出现在2000年Roy Fielding的博士论文中。

"""
	RESTful是一种定义Web API接口的设计风格,尤其适用于前后端分离的应用模式中。
"""

这种风格的理念认为后端开发任务就是提供数据的,对外提供的是数据资源的访问接口,所以在定义接口时,客户端访问的URL路径就表示这种要操作的数据资源。

1、数据安全的保障

url链接一般使用https协议进行传输,因为https协议比http协议更安全

2、接口特征表现

用api关键字标识接口url:url中含有api关键字的:
	# https://api.baidu.com/books
	# https://www.baidu.com/api/books

3、多数据版本共存

在url链接中标识数据的版本:
    # https://api.baidu.com/v1/books
    # https://www.baidu.com/api/v2/books
url中的v1、v2就是不同数据的版本体现

4、数据既是资源,均使用名词(可复数)

1、接口一般都是完成前后端数据交互的,交互的数据我们一般称之为资源:
	# https://api.baidu.com/v1/books
    
2、一般提倡用资源的复数形式,在url链接中奖励不要出现操作资源的动词,
	错误示范:# https://api.baidu.com/delete-user

3、特殊的接口可以出现动词:
    # https://api.baidu.com/login
    # https://api.baidu.com/register

5、资源操作由请求的方式来决定(method)

一般来说操作资源都会涉及到增删查改,所以我们使用请求方式来表示增删查改
    # https://api.baidu.com/books		----->get请求,获取所有书籍
    # https://api.baidu.com/books/1		----->get请求,获取主键为1的书籍
    # https://api.baidu.com/books		----->post请求,添加一本书籍
    # https://api.baidu.com/books/1		----->put请求,修改主键为1的书籍
    # https://api.baidu.com/books/1		----->delete请求,删除主键为1的书籍

6、过滤,通过在url上传参的形式传递搜索条件

只针对于搜索所有接口:
    https://api.example.com/v1/zoos?limit=10:指定返回记录的数量
    https://api.example.com/v1/zoos?offset=10:指定返回记录的开始位置
    https://api.example.com/v1/zoos?page=2&per_page=100:指定第几页,以及每页的记录数
    https://api.example.com/v1/zoos?sortby=name&order=asc:指定返回结果按照哪个属性排序,以及排序顺序
    https://api.example.com/v1/zoos?animal_type_id=1:指定筛选条件

7、响应状态码(两层)

http协议:第一层
	1XX,2XX,3XX,4XX,5XX
后端返回的状态码:第二层
	{
        "code": 200, "msg": "登录成功", "date": []
    },
	{
        "code": 1002, "msg": "请求失败"
    }
1、正常响应状态码2XX:
    200:常规请求成功
    201:创建成功
2、重定向响应状态码3XX:
    301:永久重定向
    302:暂时重定向
3、客户端异常响应状态码4XX:
    403:请求无权限
    404:请求路径不存在
    405:请求方法不存在
4、服务器异常响应状态码5XX:
    500:服务器异常

8、错误处理,应返回错误信息,error当key

{
    error:"无权限操作"
}

9、返回结果,针对不同操作,服务器向用户返回的结果应该符合以下规范

GET /collection:返回资源对象的列表(数组)
GET /collection/resource:返回单个资源对象
POST /collection:返回新生成的资源对象
PUT /collection/resource:返回完整的资源对象
DELETE /collection/resource:返回一个空文档

10、需要url请求的资源需要访问资源的请求链接

{
  	"status": 0,
  	"msg": "ok",
  	"results":[
        {
            "name":"肯德基(罗餐厅)",
            "img": "https://image.baidu.com/kfc/001.png"
        }
      	...
		]
}
 # 响应中带链接:"img": "https://image.baidu.com/kfc/001.png"

序列化

api接口开发,最核心最常见的一个过程就是序列化,所谓序列化就是把数据转换格式,序列化可以分两个阶段:
	序列化:通俗的讲序列化就是把我们自己的数据转换成json格式的数据,可以供其他语言接收使用
    反序列化:通俗的说就是将别人序列化好的json格式的数据拿过来,我通过反序列化成我自己的数据类型,然后使用
eg:
    python:{"name":"yang","age":"18"}	-----序列化----->	前端JS	
    前端JS	----->反序列化----->	前端中JS的对象:{"name":"yang","age":"18"}

drf的安装以及快速使用

1、安装drf:
	pip install djangorestframework 或者直接在pycharm中搜索djangorestframework安装
    注意事项:
        1、解释器最低版本以及Django最低版本:Python 3.6+、Django 4.2, 4.1, 4.0, 3.2, 3.1, 3.0
        2、如果Django版本不符合drf的安装条件,就会自动将Django卸载并且自动安装最新版本的Django
2、在App中注册:
    INSTALLED_APPS = [
        'rest_framework',  # 一定要加
    ]
3、写路由
	from app_one import views
    from rest_framework.routers import DefaultRouter

    router = DefaultRouter()
    router.register("books", views.BookView, "books")
    urlpatterns += router.urls

4、写视图类
    from rest_framework.viewsets import ModelViewSet
    from .serializers import BookSerializers


    class BookView(ModelViewSet):
        queryset = models.Books.objects.all()
        serializer_class = BookSerializers
5、写序列化
    5.1、先创建一个serializers.py文件
    5.2、写序列化类
        from rest_framework import serializers
        from .models import Books


        class BookSerializers(serializers.ModelSerializer):
            class Meta:
                model = Books
                fields = "__all__"	

作业

# 1 基于原生django,写book的5个接口
    from django.http import JsonResponse
    from app_one import models
    from django.views import View
    import json
	class MybookViews(View):
        def get(self, request):
            book_obj = models.Books.objects.filter(is_delete=1).all()
            book_list = []
            for book in book_obj:
                book_list.append({"book_name": book.book_name, "book_price": book.book_price})
            return JsonResponse({"code": 200, "msg": "查找成功", "date": book_list})

        def post(self, request):
            book_name = request.POST.get("book_name")
            book_price = request.POST.get("book_price")
            models.Books.objects.create(book_name=book_name, book_price=book_price)
            return JsonResponse(
                {"code": 200, "msg": "添加成功", "data": {"book_name": book_name, "book_price": book_price}})


    class MybookDetail(View):
        def get(self, request, pk):
            try:
                book_obj = models.Books.objects.filter(pk=pk, is_delete=1).first()
            except:
                return JsonResponse({"code": 101, "msg": "该书籍不存在"})
            return JsonResponse({"code": 200, "msg": "查找成功",
                                 "data": [{"book_name": book_obj.book_name, "book_price": book_obj.book_price}]})

        def put(self, request, pk):
            book_dic = json.loads(request.body)
            book_name = book_dic.get("book_name")
            book_price = book_dic.get("book_price")
            models.Books.objects.filter(pk=pk).update(book_name=book_name, book_price=book_price)
            return JsonResponse(
                {"code": 200, "msg": "修改成功",
                 "data": [{"code": 20, "msg": "修改成功", "data": [{"book_name": book_name, "book_price": book_price}]}]})

        def delete(self, request, pk):
            models.Books.objects.filter(pk=pk).update(is_delete=0)
            return JsonResponse({})
       
        
# 拓展:
	-mysql:char 和varchar
    	2、MySQL中char和varchar的区别:
        2.1、长度是否可变
            varchar 类型的长度是可变的,而 char 类型的长度是固定的
            char 类型是一个定长的字段,以 char(10) 为例,不管真实的存储内容多大或者是占了多少空间,都会消耗掉 10 个字符的空间
            通俗来讲,当定义为 char(10) 时,即使插入的内容是 'abc' 3 个字符,它依然会占用 10 个字节,其中包含了 7 个空字节
            varchar类型就是你存几个字符就占用几个字符的空间,不会浪费资源
        2.2、存储长度
            char 长度最大为 255 个字符,varchar 长度最大为 65535 个字符
        2.3、检索效率方面
            varchar 类型的查找效率比较低,而 char 类型的查找效率比较高
    -mysql--->int类型--->int(10),int(20)
        int(10)的意思是假设有一个变量名为id,它的能显示的宽度能显示10位。在使用id时,假如我给id输入10,那么mysql会默认给你存储0000000010。当你输入的数据不足10位时,会自动帮你补全位数。假如我设计的id字段是int(20),那么我在给id输入10时,mysql会自动补全18个0,补到20位为止。

request.body

request.body:
    	当使用 HTTP 协议进行通信时,请求主体(request body)是包含发送给服务器的数据的部分。它通常用于在 POST、PUT 和 PATCH 请求中发送表单数据、JSON 数据或其他类型的数据。

request.POST和request.body

request.POST与request.body:
  django中的request.POST只能取到Content-Type(请求头)为application/x-www-form-urlencoded(form表单默认格式)的数据,如果请求头为application/json(json格式),multipart/form-data(文件)等格式无法取到,只有在request.body里面能取到原生的数据。当发送过来的是JSON数据是,request.POST取到的数据是空的,这时只有用request.body取,再反序列化才能使用。

标签:name,com,request,规范,api,https,restful,book,drf
From: https://www.cnblogs.com/chao0308/p/17665852.html

相关文章

  • drf入门
    drf入门规范1、Web开发模式​ 1.1、前后端混合开发模式:​ 1.2、前后端分离开发模式2、API接口#api接口:通过网络,规定了前后端信息交互规则的url链接,也就是前后端信息交互的媒介 -https://www.baidu.com/books/--->json格式数据--->接口#拿到的是json格式的数据 -https......
  • Git提交信息规范
    1.背景Git是目前世界上最先进的分布式版本控制系统,在我们平时的项目开发中已经广泛使用。而当我们使用Git提交代码时,都需要写CommitMessage提交说明才能够正常提交。gitcommit-m"提交"然而,我们平时在编写提交说明时,通常会直接填写如"fix"或"bug"等不规范的说明,不规范......
  • 要调用API接口获取商品数据,首先需要了解该API的文档和规范
    要调用API接口获取商品数据,首先需要了解该API的文档和规范。大多数API都需要使用API密钥进行身份验证,因此您需要先注册API提供商,并从他们那里获取API密钥。以下是一些通用的步骤:注册API提供商并获取API密钥在开始使用任何API之前,您需要先注册API提供商,并从他们那里获取API密钥。请......
  • RESTful API规范,序列化,Django Rest_Framework
    一.RESTfulAPI规范REST全称是RepresentationalStateTransfer,中文意思是表述(编者注:通常译为表征性状态转移)。它首次出现在2000年RoyFielding的博士论文中。RESTful是一种定义WebAPI接口的设计风格,尤其适用于前后端分离的应用模式中。这种风格的理念认为后端开发任......
  • B端基础规范
    B端基础规范框架层:内容层(主要内容区域)|基础层(导航区域)|叠层(弹窗提示悬浮);框架:基础层——上下布局、“T”型布局、“口”型布局;常见布局01、传统布局方式:考虑分辨率的兼容问题;02、弹性布局方式:比较适合表单和表格多的产品;不会改变:文字大小、图标大小、固定高度的......
  • drf-day2
    昨日作业1用django写个demo---》postman测试1、传用户名密码到后端,查询数据库,都对了---》返回json格式{code:100,msg:登录成功}---》urlencoded2、打印request.POST3、打印request.body2写一个接口,可以长传文件{code:100,msg:上传成功}request.POST---->有......
  • 数据库中字段名的命名规范
    使用有描述性的名称:字段名应该能清楚地描述该字段所代表的含义,尽量避免使用模糊或不具有明确含义的名称。使用小写字母:使用小写字母能提高可读性,并且在某些数据库中,字段名是大小写敏感的。此外,建议使用下划线(_)来分隔单词,而不是使用空格或驼峰命名法。避免保留字和关键字:避免使......
  • 第一节 drf入门规范
    一web应用模式它是djangoweb框架,专门用来写web项目1前后端混合开发模式---》常见公司老项目-后端人员,写后端,也要写模板语法--->模板语法就是写的xx.html的Python代码-全栈开发,前后端都写 2前后端分离开发模式---》新项目,时下比较流行-后端不用写前端,只需要写接......
  • 流程、规范、制度三者之间的差异
    流程、规范和制度是组织内部管理和运作的重要概念,它们虽然有些相似,但在含义和应用上有一些区别。 1、流程(Process):流程是指按照一定的步骤和顺序执行任务的方法。它关注的是操作的顺序和流程,旨在提高工作效率并确保任务按照一定的步骤完成。2、规范(Standard):规范是指制定的准......
  • drf
    web开发模式前后端混合开发模式(老项目)前后端分离开发模式(新项目) API接口防止个人习惯差异引起的混乱,找到一个大家都觉得很好的接口实现规范,这个规范能够让后端写的接口用途一目了然,减少双方之间的合作成本。api接口:通过网络,规定了前后台信息交互规则的url链接,也就是前后......