首页 > 编程语言 >Python drf day02

Python drf day02

时间:2023-08-29 21:34:42浏览次数:45  
标签:name Python day02 price back dic api https drf

restful规范

restful规范是什么,如何来的?

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

Roy Fielding的博士论文提出的

restful规范的具体内容

1. 数据的安全保障

--》url链接一般都采用https协议进行传输,它比http 安全

2. 接口特征表现

--》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

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

---》前后端交互,交互的数据称之为资源

  数据即资源,前后端交互的数据称之为资源,url尽量使用名字

  -https://127.0.0.1/api/v1/books/ -->表示对图书操作:增加,删除,查询,修改,都用这一个地址
  -https://127.0.0.1/api/v1/get_all_books/    不符合restful规范
  -https://127.0.0.1/api/v1/delete_books/     不符合restful规范

5. 资源操作由请求方式决定

  get  请求获取数据(获取所有、获取单条)

  post  新增数据

  put  修改数据

  delete  删除数据

  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. 请求地址中带过滤条件

----》只针对搜索所有接口

 

7. 响应状态码(两层)

http响应状态码:1xx、2xx、3xx、4xx、5xx

  趣味图解HTTP状态码的含义:https://www.sohu.com/a/278045231_120014184
  -404和403 和 405
  -301和302
  -1xx表示请求正在处理---》前端一般看不到
  -2xx 表示请求处理成功--》经常看到
  -201和200有什么区别
  -3xx:重定向
  -4xx:客户端错误
  -5xx:服务端出错

成功都返回200,而在响应体中带状态码----》code:不同公司就不一样

{
"code": 101,
"msg": "用户名或密码错误"
}

-补充一:mysql 错误操作都会有个 数字(10060) 文字解释
-补充二:
-https://open.weibo.com/wiki/Error_code

8. 响应中带错误信息

{
"code": 101,
"msg": "用户名或密码错误"
}

9. 不同操作,返回格式符合如下标准

GET/collection:返回资源对象的列表(数组)

  [{name:西游记,price:19},{name:三国,price:19}]

GET/collection/resource:返回单个资源对象

  {name:三国,price:19}

POST/collection:返回新生成的资源对象

  {name:三国,price:19}

PUT/collection/resource:返回完整的资源对象

  {name:三国演义,price:19}

DELETE/collection/resource:返回一个空文档

 

---》大家都这么做

{
code:100
msg:查询成功
restult:[{name:西游记,price:19},{name:三国,price:19}]
}

10. 响应中带链接

 

序列化和反序列化

序列化:数据转换格式

序列化分两个阶段:

  序列化:把我们识别的数据转换成指定的格式提供给别人

    eg:我们在django中获取到的数据默认是模型对象,但是模型对象数据无法直接提供给前端或别的平台使用,所以我们需要把数据进行序列化,变成字符串或者json数据,提供给别人

  反序列化:把别人提供的数据转换/还原成我们需要的数据

    eg:前端js提供过来的json数据,对于python而言就是字符串,我们需要进行反序列化换成模型类对象,这样我们才能把数据保存到数据库中

drf安装和快速使用

基于Django编写符合restful规范的接口

假设已Book表为例,写他的5个接口

  -1 查询所有
  -2 新增一条
  -3 修改一条
  -4 删除一条
  -5 查询一条

使用原生Django编写

 

class BookView(View):
    # 查看全部
    def get(self, request):
        book_obj = models.Book.objects.all()
        l = []
        for i in book_obj:
            l.append({'name': i.name, 'price': i.price})
        back_dic = {'code': 100, 'msg': '查询成功', 'result': l}

        return JsonResponse(back_dic)

    # 添加数据
    def post(self, request):
        name = request.POST.get('name')
        price = request.POST.get('price')
        models.Book.objects.create(name=name, price=price)
        back_dic = {'code': 100, 'msg': '添加成功'}
        return JsonResponse(back_dic)


class BookDetailView(View):
    # 查看一条数据
    def get(self, request, pk):
        back_dic = {'code': 100, 'msg': '查询成功', 'result': []}
        book_obj = models.Book.objects.filter(pk=pk).first()
        back_dic['result'] = [{'name': book_obj.name, 'price': book_obj.price}]
        return JsonResponse(back_dic)

    # 修改一条数据
    def put(self, request, pk):
        data_dic = json.loads(request.body)
        name = data_dic.get('name')
        price = data_dic.get('price')
        back_dic = {'code': 100, 'msg': '修改成功', 'result': []}
        models.Book.objects.filter(pk=pk).update(name=name, price=price)
        back_dic['result'] = [{'name': name, 'price': price}]
        return JsonResponse(back_dic)

    # 删除一条数据

    def delete(self, request, pk):
        models.Book.objects.filter(pk=pk).delete()
        back_dic = {'code': 100, 'msg': '删除成功'}
        return JsonResponse(back_dic)

使用drf版本

# 先安装djangorestframework模块3.14.0版本

'''在app中注册
        INSTALLED_APPS = [
            'rest_framework',  # 一定不要忘了加  ,
        ]
'''
# 写路由
from rest_framework.routers import DefaultRouter

router = DefaultRouter()
router.register('book', views.BookView, 'book')

urlpatterns += router.urls

# 写视图类
from rest_framework.viewsets import ModelViewSet
from app01.serializer import BookSerializer

class BookView(ModelViewSet):
    queryset = models.Book.objects.all()
    serializer_class = BookSerializer

# 写序列化类
from rest_framework import serializers
from app01.models import Book


class BookSerializer(serializers.ModelSerializer):
    class Meta():
        model = Book
        fields = '__all__'

 

标签:name,Python,day02,price,back,dic,api,https,drf
From: https://www.cnblogs.com/zfq132/p/17664910.html

相关文章

  • Python列表的索引和切片
    Python列表的索引和切片使用及语法如下:列表索引:使用方括号([])来访问列表中的元素。索引从0开始,最左边的元素的索引为0,依次递增。负数索引从最右边的元素开始,最右边的元素的索引为-1,依次递减。示例:my_list=['a','b','c','d']print(my_list[0])#输出'a'print(my......
  • 信息化热词分析python
    环境准备#安装requests库pipinstallrequests#安装bs4库pipinstallbs4#安装jieba库pipinstalljieba#安装selenium库pipinstallselenium#安装lxml库pipinstalllxml#安装matplotlib库pipinstallmatplotlib#安装numpy库pipinstallnumpy#安装Pill......
  • drf-restful规范
    RESTfulAPI规范简介: REST全称是RepresentationalStateTransfer,中文意思是表述(编者注:通常译为表征性状态转移)。它首次出现在2000年RoyFielding的博士论文中。""" RESTful是一种定义WebAPI接口的设计风格,尤其适用于前后端分离的应用模式中。"""这种风格的理念认为后端......
  • drf入门
    drf入门规范1、Web开发模式​ 1.1、前后端混合开发模式:​ 1.2、前后端分离开发模式2、API接口#api接口:通过网络,规定了前后端信息交互规则的url链接,也就是前后端信息交互的媒介 -https://www.baidu.com/books/--->json格式数据--->接口#拿到的是json格式的数据 -https......
  • python中实现兔子问题递推
     兔子一代生3对,然后每隔一代兔子才有繁殖能力,问最初有1对兔子,问5代后一共有多少只兔子?001、直接实现>>>list1=[1]*5>>>list1[1,1,1,1,1]>>>foriinrange(2,5):...list1[i]=list1[i-1]+list1[i-2]*3...>>>list1##1到5代......
  • python多线程
    python多线程多线程threading,利用CPU和IO可以同时执行的原理多进程multiprocessing,利用多核CPU的能力,真正的并行执行任务异步IOasyncio,在单线程利用CPU和IO同时执行的原理,实现函数异步执行使用Lock对资源加锁,防止冲突访问使用Queue实现不同线程/进程之间的数据通信,实现生......
  • Centos误删系统自带python2.7,yum报错恢复方法
     使用wget分别下载python以及yum的rpm包资源地址如下:          http://vault.centos.orgmkdir/usr/local/src/pythoncd/usr/local/src/pythonwgethttp://vault.centos.org/7.6.1810/os/x86_64/Packages/python-backports-1.0-8.el7.x86_64.rpmwgethtt......
  • python3.6使用wordcloud 1.9报错ValueError: Only supported for TrueType fonts
    该版本的wordcloud的源码中显示不兼容python3.6 解决办法:修改wordcloud源码修改前508:box_size=draw.textbox((0,0),word,font=transposed_font,anchor="lt")510:result=occupancy.sample_position(box_size[3]+self.margin,......
  • python字符串内容分割
    分隔主要涉及到split,rsplit,splitlines,partition和rpartition五个方法。split以指定字符串为分隔符切片,如果maxsplit有指定值,则仅分隔maxsplit+1个子字符串。返回的结果是一个列表。没有指定分隔符,默认使用空格,换行等空白字符进行分隔char="hello\nworld"result=c......
  • 【Python】报错处理笔记
    shutil.rmtree(path)报错:PermissionError:[WinError5]分析:对应的目录或文件被设置了只读属性解决方案:defremove_readonly(func,path,_):#错误回调函数,改变只读属性位,重新删除"Clearthereadonlybitandreattempttheremoval"os.chmod(path,stat.S_I......