restful规范,django版本间区别,API接口

web开发模式

1.前后端混合开发
-模板渲染在后端完成
2.前后端分离
-后端只负责写接口,前端来调用,通信使用json格式
   -多端(web,app),都可以使用同一个接口。
   写好一个接口,不同种类的终端都可以向这个接口发请求,获取数据。所以就需要写的接口符合一定的规范。

API接口

为了在团队内部形成共识、防止个人习惯差异引起的混乱,我们需要找到一种大家都觉得很好的接口实现规范,而且这种规范能够让后端写的接口,用途一目了然,减少双方之间的合作成本。

通过网络,规定了前后台信息交互规则的url链接,也就是前后台信息交互的媒介

还比如在项目中如果使用支付功能,就可以调用支付宝或则微信提供的第三方接口,调用接口就可以使用支付功能。

# 详细可以查看微博开放平台
https://open.weibo.com/wiki/2/users/show

restful规范

1 写接口的规范,大部分的接口,都会按照这个规范去写(Web API接口的设计风格)2000年Roy Fielding的博士论文中
2 总共10点


# 1 使用https协议进行传输数据(保证数据安全)
# 2 url中带关键字api
   https://api.baidu.com
   https://www.baidu.com/api
       
# 3 url中带版本信息
https://api.baidu.com/v1
https://api.baidu.com/v2
# 4 数据即是资源,均使用名词
   https://api.baidu.com/users
   https://api.baidu.com/books
   https://api.baidu.com/book
       
# 5 资源操作由请求方式决定
-查询操作---get
   -新增操作----post
   -修改操作----put,patch
   -删除操作----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 - patch请求:局部修改主键为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?animal_type_id=1:指定筛选条件
       
# 7 响应中要带状态码(自己定义,http响应状态码)
{
   status:200
}
   
# 8 响应返回错误信息
  {
       status:200
       msg: "无权限操作"
  }
   
# 9 返回结果,遵循如下规范(大概率都没有遵循)
   GET /collection:返回资源对象的列表(数组)
   GET /collection/resource:返回单个资源对象
   POST /collection:返回新生成的资源对象
   PUT /collection/resource:返回完整的资源对象
   PATCH /collection/resource:返回完整的资源对象
   DELETE /collection/resource:返回一个空文档
   
   
# 10 返回数据中带链接地址
{
"status": 0,
"msg": "ok",
"results":[
      {
           "name":"肯德基(罗餐厅)",
           "img": "https://image.baidu.com/kfc/001.png"
      }
]
}

接口测试工具

1 很多 postman,浏览器插件,接口压力测试工具Jmeter
2 详见http://www.liuqingzheng.top/python/Django-rest-framework%E6%A1%86%E6%9E%B6/1-drf-drf%E5%85%A5%E9%97%A8%E8%A7%84%E8%8C%83/

序列化

序列化: 
反序列化:

简单理解为序列化就是我们把数据转成一种通用格式,然后传递;
反序列化就是将这种通用格式转化为我们想要的数据格式。


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

drf介绍和安装(django)

# Django Rest_Framework:是django的一个app,可以借助它快速在django框架开发出符合restful规范的接口
# 提供了:REST framework还提供了认证、权限、限流、过滤、分页、接口文档等功能支持
# 官方文档:https://www.django-rest-framework.org/

#安装
pip3 install djangorestframework
   # 注意:跟django版本对应好,django 2.2.2 drf最新
   
   
可以把drf看作是django的一个应用(这里每次使用rest_framework时,需要在settings.py中注册使用)或插件。

django版本间部分区别

1. 上面说的drf最新版本已经不支持1.x版本的django了,支持2.x,3.x
2. 1.x 与2.x 的区别
路由:
1.x 使用的正则,进行路由匹配
      urlpatterns = [
          url('^..../', view.xxx),
      ]
  2.x 使用path,但是也支持正则(re_path,相当于1.x中的url),同时,2.x支持转换器(默认5个),支持自定义转换器
  patterns = [
  path('xxx/<int:xx>', view.xxx),
  re_path('^xxxxx/', view.xxx)
  ]
模型层:
2.x中创建模型时,需要对Forgienkey 和 一对一字段添加级联删除(on_deltet = xxx ) 参数

3. 3.x中的settings.py中 ,不再使用os模块添加环境变量



版本区别简单介绍到这里。

作业: 写一个表 Book表,单表,实现符合restful规范的5个接口

../books/  get                  完成
../books/1  get     筛选 基本完成,有bug
../books/  post     新增
../books/1 delete   删除        基本完成,有bug
../books/1 put      修改

这里我使用的是CBV写的,功能未完全实现
1. 模型层代码
from django.db import models

# Create your models here.



class Student(models.Model):
   name = models.CharField(max_length=32,)
   gender = models.CharField(max_length=32)
   age = models.IntegerField(verbose_name='年龄')


class Book(models.Model):
   name = models.CharField(max_length=32)
   price = models.DecimalField(max_digits=8, decimal_places=2)
   author = models.CharField(max_length=32)
   
2.路由层
   re_path(r'^book/$', view.Book.as_view()),
   re_path(r'^book/(?P<pk>\d+)/', view.Book.as_view()),
   
3. 视图层
class Book(View):

   def param(self,request, pk):
       pass

   # pk=?
   def get(self, request, **kwargs):
       book_dic = {'code':1, 'msg':''}
       book_queryset = models.Book.objects.filter()
       if kwargs:
           book_list = book_queryset.filter(**kwargs)
           # 查询不到的书籍如何表示出来
           if book_list:
               book = book_list.first()
               book_dic[book.name] = {'出版社': book.publish, '作者': book.author, '价格': book.price}
               book_dic['msg'] = '查询书籍成功!'
           else:
               book_dic['code'] = 2
               book_dic['msg'] = '书籍不存在'
           return JsonResponse(book_dic)
       # 设置成字典套列表
       for book in book_queryset:
           book_dic[book.name] = {'出版社': book.publish, '作者': book.author, '价格': book.price}
       # print(book_dic)
       return JsonResponse(book_dic)

   def post(self, request):

       return JsonResponse({'post': '添加功能'})

   # 删除功能
   def delete(self, request, **kwargs):
       book_dic = {'code': 1, 'msg': ""}

       if kwargs:
           book_list = models.Book.objects.filter(**kwargs).first()
           if book_list:
               # models.Book.objects.filter(**kwargs).delete()
               book_dic['msg'] = '删除成功!'
           else:
               book_dic['msg'] = '书籍不存在'
           return JsonResponse(book_dic)
       book_dic['code'] = 4
       book_dic['msg'] = '不能执行删除操作!'
       return JsonResponse(book_dic)

   # 修改
   def put(self, request, **kwargs):

       return JsonResponse({'put': '修改功能'})

使用drf完成作业

2. 序列化组件
from rest_framework import serializers
from rest_framework.serializers import ModelSerializer
from .models import Student,Book



class StuSerizliz(serializers.Serializer):
   name = serializers.CharField()
   gender = serializers.CharField()
   age = serializers.IntegerField()

   def update(self, instance, validated_data):
       # 重写update方法
       instance.name = validated_data.get('name')
       instance.gender = validated_data.get('gender')
       instance.age = validated_data.get('age')
       instance.save()
       return instance

   # 重写create方法
   def create(self, validated_data):
       create_obj = Student.objects.create(**validated_data)
       return create_obj



posted @ 2021-06-30 21:21  代码歌  阅读(212)  评论(0)    收藏  举报