2021年9月22日所学(个人笔记)

DRF

diango-rest framework:封装过以后的Django框架,DRF是一个强大灵活的Django工具包,用于在Web后台构建Restful接口

Restful是一种网络应用程序的设计风格和开发方式

Restful指的是一组架构约束条件和原则,满足这些约束条件和原则的应用程序或设计就是Restful

只要符合Restful规定的条件,就具备Restful的风格

它主要用于客户端和服务端交互类的软件。基于这个风格设计的软件可以更简洁,更有层次,更易于实现缓存等机制。

rest framework和Django属于父子关系,rest framework封装了Django

Restful⻛格就是把所有数据都当做资源,对表的操作就是对资源操作

Restful规则:

1.API与用户的通信协议,总是使用HTTPS协议

2.域名

1)子域名方式 https://api.example.com 尽量将API部署在专用域名(会存在跨域问题) https://www.example.com 2)url方式 https://example.org https://example.org/api API很简单

3.版本 /v1/,/v2/....

URL,如:https://api.example.com/v1/ 请求头 跨域时,引发发送多次请求

4.面向资源编程:url必须使用名词表示(可复数)

https://api.example.com/v1/zoos https://api.example.com/v1/animals https://api.example.com/v1/employees

5.method:

GET(查询数据) # 从服务器取出资源(⼀项或多项) POST(创建数据) # 在服务器新建⼀个资源 PUT(修改数据) # 在服务器更新资源(客户端提供改变后的完整资源) PATCH(修改属性) # 在服务器更新资源(客户端提供改变的属性) DELETE(删除数据) # 从服务器删除资源

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.状态码

1)HTTP状态码:

200:请求成功,一般用于GET与POST请求

0

2)公司内部定义状态码:数据——>msg:成功,data:200(code:0)

msg:...不存在,data:None(code:4004)

msg:查询出错,稍后再试(code:5000)

Restful和Django的区别:

view:1)Django:view——># 获取参数:GET、POST、Body # 返回:HttpResponse、JsonResponse 2)Restful:APIView——># 获取参数:get—>data = request.query_params post—>data = request.data # 返回:response 3)ModelViewSet:什么都不用干,它是封装度最高的DRF的视图类,包含了增删改查中的所有接口操作。

代码示例:

模型类: from django.db import models # Create your models here. class UserTable(models.Model): name = models.CharField(max_length=64, unique=True) age = models.IntegerField(default=18) classroom = models.CharField(max_length=20) phone = models.IntegerField() class Meta: db_table = 'users'

View

# View的CURD from myuser.models import UserTable from django.views import View from django.http.response import JsonResponse class User1(View): def get(self,request): users = UserTable.objects.all() data = [ { 'id':user.id, 'name':user.name, 'age':user.age, 'classroom':user.classroom, 'phone':user.phone } for user in users ] return JsonResponse(data,safe=False) def post(self,request): name = request.POST.get('name') age = request.POST.get('age') classroom = request.POST.get('classroom') phone = request.POST.get('phone') if not all([name,age,classroom,phone]): return JsonResponse({'msg':'缺少参数'},status=400) try: UserTable.objects.create(name=name,age=age,classroom=classroom,phone=phone) except Exception as e: return JsonResponse({'msg':'添加失败'},status=500) return JsonResponse({'msg':'添加成功'},status=201) class User2(View): def delete(self,request,pk): UserTable.objects.filter(id=pk).delete() return JsonResponse({'msg':'删除成功'},status=204) def post(self,request,pk): try: user = UserTable.objects.get(id=pk) except UserTable.DoesNotExist: return JsonResponse({'msg':'用户不存在'},status=404) name = request.POST.get('name',user.name) age = request.POST.get('age', user.age) classroom = request.POST.get('classroom',user.classroom) phone = request.POST.get('phone',user.phone) UserTable.objects.filter(id=pk).update(name=name,age=age,classroom=classroom,phone=phone) return JsonResponse({'msg':'修改成功'},status=201)

路由配置: path('user1/',User1.as_view()), path('user1/<int:pk>/',User2.as_view()),

APIView

# APIView的CURD user/?id=xx/ from myuser.models import UserTable from rest_framework.views import APIView from rest_framework.response import Response from myuser.ser import UserSer class User1(APIView): def get(self, request): id = request.query_params.get('id') user_data = UserTable.objects.filter(id=id) ser = UserSer(user_data, many=True) data = ser.data return Response({'code': 0, 'data': data}) def post(self, request): data = request.data ser = UserSer(data=data) ser.is_valid() ser.save() return Response({'code': 201}) def put(self,request): id = request.data.get('id') data = request.data user_data = UserTable.objects.get(id=id) ser = UserSer(user_data,data=data) ser.is_valid() ser.save() return Response({'code': 201}) def delete(self,request): id = request.query_params.get('id') UserTable.objects.filter(id=id).delete() return Response({'code': 204})

序列化器: from rest_framework.serializers import ModelSerializer from myuser.models import UserTable class UserSer(ModelSerializer): class Meta: model = UserTable fields = '__all__'

路由配置: path('user1/',User1.as_view()),

ModelViewSet:

class UserTable(models.Model): name = models.CharField(max_length=64, unique=True) age = models.IntegerField(default=18) classroom = models.CharField(max_length=20) phone = models.IntegerField() class Meta: db_table = 'users'

路由配置: from rest_framework.routers import DefaultRouter router = DefaultRouter() router.register('user1',User3) path("",include(router.urls))

APIview⾥如何获取http⾥的数据?

request.data.get()  获取post方法表单里的数据

request.post.get()   获取post方法表单里的数据

request.body  获取json数据

request.GET.get()   获取URL里的数据

request.query_parmas  和get差不多,获取URL里的数据

为什么APIView里获取的数据可以直接当做字典操作?

因为获取的数据是以查询集的类型返回的

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值