restful规范、序列化和反序列化、基于django原生编写5个接口、drf介绍和快速使用、cbv源码分析

1|0restful规范、序列化和反序列化、基于django原生编写5个接口、drf介绍和快速使用、cbv源码分析

1|1一、restful规范

1|01.1 概念

# 概念 REST(Representational State Transfer)表征性状态转移,首次出现在2000年的Roy Fielding的博士论文中。 RESTful是一种定义Web API接口的设计风格,尤其适用于前后端分离的应用模式中。

1|01.2 十个规范

1、数据的安全保障,通常使用https(http+ssl/tsl)协议 url链接一般都采用https协议进行传输 采用https协议传输,可以提高数据交互过程中的安全性 2、接口中带api标识 https://api.qinghua.com/books https://www.beida.com/api/books 3、多版本共存,路径中带有版本信息 https://www.qinghua.com/api/v1/login https://www.qinghua.com/api/v2/login 4、数据就是资源,均使用名词,尽量不出现动词 接口一般都是完成前后台数据的交互 特殊的接口可以出现动词,因为这些接口一般没有一个明确的资源,或者动词就是接口的核心含义 https://www.qinghua.com/login 5、资源操作由请求方式决定(method) 操作资源一般都会涉及到增删改查,我们通过请求方式的不同,来标识增删改查的动作 https://www.beida.com/api/books -get请求:获取所有的书籍 https://www.beida.com/api/books/1 -get请求:获取主键值为1书籍 https://www.beida.com/api/books -post请求:新增一本书籍 https://www.beida.com/api/books/1 -put请求:修改主键为1的书籍 https://www.beida.com/api/books/1 -delete请求:删除主键为1的书籍 6、在请求的地址中携带过滤条件 https://www.beida.com/api/books?name=三&price=88 7、响应状态码:两套 查看响应状态码链接: https://blog.csdn.net/li_chunlong/article/details/120787872 http中的响应状态码: 1XX:请求正在处理 2XX:成功响应 3XX:重定向 4XX:客户端错误 5XX:服务端错误 公司内部规定的响应状态码,放在响应体中 eg: {code:100} 8、返回数据中携带错误信息 { code:100, msg:"登陆成功" } 9、返回结果 GET 获取所有数据: 返回资源对象的列表(数组)[{name:红楼梦,price:99},{name:三国演义,price:99},{name:西游记,price:99}] GET 单个对象: 返回单个资源对象:{name:红楼梦,price:99} POST 新增对象: 返回新生成的资源对象:{name:西厢记,price:99} PUT 修改对象:返回完整的资源对象 : {name:聊斋志异,price:100} DELETE 删除: 返回一个空文档 10、响应数据中携带链接

1|2二、序列化和反序列化

# api接口开发。最核心最常见的一个过程就是序列化,所谓序列化就是把【数据转换格式】 # 序列化可以分为两个阶段 # 序列化: 把我们识别的数据转换成指定的格式提供给别人 -字典,列表------》json格式存到文件中了 -例如:我们在django中获取到的数据默认是模型对象,但是模型对象数据无法直接提供给前端或别的平台使用,所以我们需要把数据进行序列化,变成字符串或者json数据,提供给别人 -read # 反序列化:把别人提供的数据转换/还原成我们需要的格式。 -例如:前端js提供过来的json数据,对于python而言就是字符串,我们需要进行反序列化换成模型类对象,这样我们才能把数据保存到数据库中。 -write

1|3三、基于django原生编写5个接口

# 以后写的接口,基本上都是5个接口及其变形 -查询所有 -查询单个 -新增一个 -修改一个 -删除一个 # 基于books单表为例,写5个接口 -创建book表 -表迁移 -录入假数据:直接录,后台管理录 -写查询所有接口---》遵循restful规范,使用cbv -新增一个数据---》 -查询一个 -修改一个:put提交的数据,不能从requets.POST中取 -删除一个

1|03.1 urls文件

from django.contrib import admin from django.urls import path from text import views urlpatterns = [ path('admin/', admin.site.urls), path('api/v1/books/', views.BookView.as_view()), path('api/v1/books/<int:pk>', views.BookDetailView.as_view()), ]

1|03.2 models文件

from django.shortcuts import render # Create your views here. from django.http import JsonResponse from django.views import View from .models import BookInfo import json class BookView(View): # 查询所有 def get(self, request): # 查询所有的图书,查询出来的books是queryset对象,不能直接给前端 books = BookInfo.objects.all() # 转换为json格式,传给前端 # 把queryset对象转换为列表后,再使用JsonResponse # JsonResponse只能放字典或者列表,放入列表还需要指定safe = False # 使用for循环去拼接 book_list = [] for book in books: book_list.append({'book_name': book.book_name, 'book_price': book.book_price, 'book_public': book.book_price }) return JsonResponse(book_list, safe=False) # 如果出现编码问题,可以使用json_dumps_params={'ensure_ascii': False}解决 # return JsonResponse(book_list, safe=False, json_dumps_params={'ensure_ascii': False}) # 新增书籍 def post(self, request): # 取出前端传入的数据,并传入到数据库中,返回新增的对象 book_name = request.POST.get('book_name') book_price = request.POST.get('book_price') book_public = request.POST.get('book_public') book = BookInfo.objects.create(book_name=book_name, book_price=book_price, book_public=book_public ) return JsonResponse({'book_name': book.book_name, 'book_price': book.book_price, 'book_public': book.book_public }) class BookDetailView(View): # 查询单个 def get(self, request, pk): book = BookInfo.objects.filter(pk=pk).first() return JsonResponse({'book_name': book.book_name, 'book_price': book.book_price, 'book_public': book.book_public }) # 修改书籍 def put(self, request, pk): # 查询需要修改的书籍 book = BookInfo.objects.filter(pk=pk).first() # 将前端的数据通过request.body变成json字符串形式 book_dict = json.loads(request.body) # 从前端获取修改后的数据 book.book_name = book_dict.get('book_name') book.book_price = book_dict.get('book_price') book.book_public = book_dict.get('book_public') book.save() return JsonResponse({'id': book.id, 'book_name': book.book_name, 'book_price': book.book_price, 'book_public': book.book_public }) # 删除书籍 def delete(self, request, pk): # 获取书籍对象并删除 BookInfo.objects.filter(pk=pk).delete() return JsonResponse(data={})

1|4四、drf介绍和快速创建5个接口

# djangorestframework: drf 帮助我们快速的实现符合restful规范的接口 # django 最新 4.x ,一般都会用最新版的上一版3.x # drf最新支持到djagno 3.x ,最新不支持2.x # 安装drf pip3 install djangorestframework -i http://pypi.douban.com/simple/ --trusted-host pypi.douban.com/simple/ # 由于你是django2.x 它发现它不支持,它会自动写在dajgno,安装最新的django 4.x # 使用drf编写5个接口

1|04.1 views文件

from .models import BookInfo from rest_framework.viewsets import ModelViewSet from .serializer import BookSerializer class BookView(ModelViewSet): queryset = BookInfo.objects.all() serializer_class = BookSerializer

1|04.2 serializer文件

# coding:utf-8 from rest_framework import serializers from .models import BookInfo class BookSerializer(serializers.ModelSerializer): class Meta: model = BookInfo fields = '__all__'

1|04.3 urls文件

from django.contrib import admin from django.urls import path from text import views # 使用drf写五个接口 from rest_framework.routers import SimpleRouter router = SimpleRouter() router.register('books', views.BookView, basename='books') urlpatterns = [ path('admin/', admin.site.urls), ] urlpatterns += router.urls

1|5五、cbv源码分析

# 1 路由中写的:path('api/v1/books/', views.BookView.as_view()),第二个参数无论是fbv还是cbv放的都是函数内存地址 -当请求来了,匹配成功会执行,views.BookView.as_view()(request) -views.BookView.as_view()执行结果是View的类方法as_view返回的结果是内层函数view,是个函数内层地址 -本身请求来了,匹配成功,会执行view(request) def view(request, *args, **kwargs): return self.dispatch(request, *args, **kwargs) -self.dispatch View类的方法 def dispatch(self, request, *args, **kwargs): # request.method请求方式转成小写,必须在列表中才能往下走 if request.method.lower() in self.http_method_names: # 反射,去self【视图类的对象:BookView】,去通过get字符串,反射出属性或方法 # BookView的get方法 handler = getattr(self, request.method.lower(), self.http_method_not_allowed) else: handler = self.http_method_not_allowed # BookView的get方法,加括号,传入request return handler(request, *args, **kwargs)

1|6六、新增图书,三种编码格式都能增加成功

class BookView(View): def post(self, request): # 取出前端传入的数据,并传入到数据库中,返回新增的对象 if request.POST: book_name = request.POST.get('book_name') book_price = request.POST.get('book_price') book_public = request.POST.get('book_public') book = BookInfo.objects.create(book_name=book_name, book_price=book_price, book_public=book_public ) return JsonResponse({'book_name': book.book_name, 'book_price': book.book_price, 'book_public': book.book_public }) else: book_dict = json.loads(request.body) book_name = book_dict.get('book_name') book_price = book_dict.get('book_price') book_public = book_dict.get('book_public') book = BookInfo.objects.create(book_name=book_name, book_price=book_price, book_public=book_public ) return JsonResponse({'book_name': book.book_name, 'book_price': book.book_price, 'book_public': book.book_public })

__EOF__

本文作者少年奇妙游
本文链接https://www.cnblogs.com/HaiMan/p/17080865.html
关于博主:评论和私信会在第一时间回复。或者直接私信我。
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
声援博主:如果您觉得文章对您有帮助,可以点击文章右下角推荐一下。您的鼓励是博主的最大动力!
posted @   负剑远游行归来仍少年  阅读(51)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· winform 绘制太阳,地球,月球 运作规律
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· AI 智能体引爆开源社区「GitHub 热点速览」
· 写一个简单的SQL生成工具
· Manus的开源复刻OpenManus初探
点击右上角即可分享
微信分享提示

喜欢请打赏

扫描二维码打赏

支付宝打赏