1 restful规范(重要,不难)
| 概念: |
| REST全称是Representational State Transfer,中文意思是表述:表征性状态转移,它首次出现在2000年Roy Fielding的博士论文中。 |
| |
| RESTful是一种定义Web API接口的设计风格,尤其适用于前后端分离的应用模式中 |
| -1 数据的安全保障,通常使用https(http+ssl/tsl)协议 |
| -url链接一般都采用https协议进行传输 |
| -采用https协议,可以提高数据交互过程中的安全性 |
| |
| -2 接口中带api标识 |
| -https://api.lqz.com/books |
| -https://www.lqz.com/api/books 咱们用这个 |
| |
| -3 多版本共存,路径中带版本信息 |
| -https://api.lqz.com/v1/login |
| -https://www.lqz.com/api/v2/login |
| |
| -4 数据即是资源,均使用名词,尽量不出现动词(最核心的) |
| -接口一般都是完成前后台数据的交互,交互的数据我们称之为资源 |
| -接口形式如下 |
| https://api.baidu.com/users |
| https://api.baidu.com/books |
| -特殊的接口可以出现动词,因为这些接口一般没有一个明确的资源,或是动词就是接口的核心含义、 https://api.baidu.com/login |
| |
| -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 在请求地址中带过滤条件 |
| https://api.baidu.com/books?name=红&price=99 |
| |
| -7 响应中状态码:两套 |
| -http响应状态码:http://tools.jb51.net/table/http_status_code |
| 1XX 请求正在处理 |
| 2XX 请求成功 常见的有 200请求成功 201创建成功 |
| 3XX 重定向 常见的有 301临时重定向 302永久重定向 |
| 4XX 客户端错误 常见的有 403没有全向 404没用该资源地址 |
| 5XX 服务器错误 常见的有 500遇到了不知道如何处理的请求 501请求方法不被支持 502服务器无法响应请求 |
| -公司内部规定的响应状态码,放在响应体中 |
| {code:0} 咱们后期一般使用100 101 102这种 |
| |
| -8 返回数据中带错误信息 |
| { |
| code:0 |
| msg: "ok/用户名错误" |
| } |
| |
| -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 响应数据中带链接 |
2 序列化反序列化
api接口开发,最核心最常见的一个过程就是序列化,所谓序列化就是把【数据转换格式】,序列化可以分两个阶段:
序列化:
| 把我们识别的数据转换成指定的格式提供给别人 |
| |
| 字典,列表-----》以json格式存到文件中 |
| 例如:我们在django中获取到的数据默认是模型对象,但是模型对象数据无法直接提供给前端或别的平台使用,所以我们需要把数据进行序列化,变成字符串或者json数据,提供给别人 |
| -read |
反序列化:
| 例如:前端js提供过来的json数据,对于python而言就是字符串,我们需要进行反序列化换成模型类对象,这样我们才能把数据保存到数据库中。 |
| -write |
3 基于django原生编写5个接口
写接口:总共就5个及5个的变形
| 获取所有 get |
| 获取单个 get |
| 新增一条 post |
| 修改一条 put/patch |
| 删除一条 delete |
基于books单表为例,写5个接口
| -创建book表 |
| -表迁移 |
| -录入假数据:直接录,后台管理录 |
| -写查询所有接口---》遵循restful规范,使用cbv |
| -新增一个数据---》 |
| -查询一个 |
| -修改一个:put提交的数据,不能从requets.POST中取 |
| -删除一个 |
models.py
| from django.db import models |
| |
| |
| class Book(models.Model): |
| name = models.CharField(max_length=32) |
| price = models.CharField(max_length=32) |
| publish = models.CharField(max_length=32) |
urls.py
| urlpatterns = [ |
| path('admin/', admin.site.urls), |
| path('api/v1/books/', views.BookView.as_view()), |
| path('api/v1/books/<int:pk>', views.BookDetailView.as_view()), |
| ] |
views.py
| from django.shortcuts import render, HttpResponse |
| |
| from django.http import JsonResponse |
| from .models import Book |
| from django.views import View |
| |
| import json |
| |
| |
| class BookView(View): |
| |
| def get(self, request): |
| |
| books = Book.objects.all() |
| |
| |
| book_list = [] |
| for book in books: |
| book_list.append({'name': book.name, 'price': book.price, 'publish': book.publish}) |
| |
| |
| |
| return JsonResponse(book_list, safe=False, json_dumps_params={'ensure_ascii': False}) |
| |
| |
| def post(self, request): |
| |
| name = request.POST.get('name') |
| price = request.POST.get('price') |
| publish = request.POST.get('publish') |
| |
| book = Book.objects.create(name=name, price=price, publish=publish) |
| |
| return JsonResponse({'name': book.name, 'price': book.price, 'publish': book.publish}) |
| |
| |
| class BookDetailView(View): |
| |
| def get(self, request, pk): |
| book = Book.objects.filter(pk=pk).first() |
| |
| return JsonResponse({'id': book.id, 'name': book.name, 'price': book.price, 'publish': book.publish}) |
| |
| |
| def put(self, request, pk): |
| |
| book = Book.objects.filter(pk=pk).first() |
| |
| 下面这种方法存在问题,因为put提交的数据用request.POST取不到 |
| |
| |
| |
| |
| |
| |
| print(request.body) |
| book_dic=json.loads(request.body) |
| book.name = book_dic.get('name') |
| book.price = book_dic.get('price') |
| book.publish = book_dic.get('publish') |
| book.save() |
| |
| return JsonResponse({'id': book.id, 'name': book.name, 'price': book.price, 'publish': book.publish}) |
| |
| |
| def delete(self, request, pk): |
| Book.objects.filter(pk=pk).delete() |
| return JsonResponse(data={}) |
4 drf介绍和快速使用
| 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个接口
views.py
| from .serializer import BookSerializer |
| from rest_framework.viewsets import ModelViewSet |
| class BookView(ModelViewSet): |
| queryset = Book.objects.all() |
| serializer_class = BookSerializer |
serializer.py
| from rest_framework import serializers |
| from .models import Book |
| class BookSerializer(serializers.ModelSerializer): |
| class Meta: |
| model = Book |
| fields = '__all__' |
urls.py
| from rest_framework.routers import SimpleRouter |
| router = SimpleRouter() |
| router.register('books', views.BookView, 'books') |
| |
| urlpatterns = [ |
| path('admin/', admin.site.urls), |
| ] |
| |
| urlpatterns += router.urls |
在 settings中
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): |
| |
| if request.method.lower() in self.http_method_names: |
| |
| |
| handler = getattr(self, request.method.lower(), self.http_method_not_allowed) |
| else: |
| handler = self.http_method_not_allowed |
| |
| return handler(request, *args, **kwargs) |
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步