昨日回顾
| |
| -前后端混合:bbs项目, 图书管理---->模板语法---> 后端通过模板语法把模板【xx.html】 |
| -前后端分离: 后端,不需要写前端,只需要提供接口: 前端负责前端 |
| -PC端, web端, 网页, 网站 |
| -app: 安卓 ios |
| -小程序: 微信小程序, 支付宝小程序... |
| |
| |
| -前后端交互的媒介---> 前端指的是大前端, 不仅仅是网站, app 小程序 后端: python, go, java...的web后端, 咱们现在只会使用python的django写后端 |
| -url: |
| -请求方式: |
| -请求数据: 地址栏中数据--->request.GET, 请求体中数据:request.POST |
| -响应数据: json |
| |
| |
| |
| -请求体的编码格式 |
| -urlencoded: 默认情况----->key value形式----> 组装成 name=1qz&age=19 |
| -request.body |
| -form-data: 传文件和数据, 组装成很复杂形式, 从request.body中一取就报错 |
| -json: 放在body体中{"name":"jason", "age":"19"} |
| |
| |
| -返回数据 |
| -body:响应体--->如果是浏览器就是看到的页面 postman就是下面显示的 |
| -响应头 |
| -响应的cookie |
| |
今日内容
1 restful规范(重点)
| |
| REST全称是Representational State Transfer,中文意思是表述:表征性状态转移,它首次出现在2000年Roy Fielding的博士论文中。 |
| |
| RESTful是一种web API接口的设计风格, 尤其适用于前后端分离的应用模式中 |
| |
| |
| -1 数据的安全保障, 通常使用https(http+ssl/tsl)协议 |
| -url连接一般都采用https协议进行传输 |
| -采用https协议,可以提高数据交互过程中的安全性 |
| |
| -2 接口中带api表示 |
| -https://api.wyj.com/books |
| -https://www.wyj.com/api/books |
| |
| |
| -3 多版本共存, 路径中带版本信息 |
| -https://api.wyj.com/v1/login |
| -https://www.wyj.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响应状态码:1xx:请求正在处理 2xx: 成功响应 , 3xx: 重定向,4xx:客户端错误,5xx:服务端错误 |
| -https://blog.csdn.net/li_chunlong/article/details/120787872 |
| -公司内部规定的响应状态码, 放在响应体中 |
| {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 序列化 反序列化
| |
| |
| |
| -字典, 列表 ----> json格式存到文件中 |
| -例如: 我们在django中获取到的数据默认是模型对象, 但是模型对象数据都无法直接提供给前端或别的平台使用, 所以我们需要把数据进行序列化, 变成字符串或者json数据, 提供给别人。 |
| -read |
| |
| |
| |
| -例如:前端js提供过来的json数据, 对于python而言就是字符串, 我们需要进行反序列化换成模型类对象, 这样我们才能把数据保存到数据库中。 |
| -write |
3 基于django原生编写5个接口
| |
| -查询所有 |
| -查询单个 |
| -新增一个 |
| -修改一个 |
| -删除一个 |
| |
| |
| -创建book表 |
| -表迁移 |
| -录入假数据, 直接录,后台管理录 |
| -写查询所有接口--->遵循restful规范, 使用cbv |
| -新增一个数据---> |
| -查询一个 |
| -修改一个: put提交的数据, 不能从request.POST中取 |
| -删除一个 |
4 drf介绍和快速使用
| |
| |
| |
| |
| |
| |
| pip3 install djangorestframework -i http://pypi.douban.com/simple/ --trusted-host pypi.douban.com/simple/ |
| |
| |
| |
| |
| |
| from .serializer import BookSerializer |
| from rest_framework.viewsets import ModelViewSet |
| class BookView(ModelViewSet): |
| queryset = Book.objects.all() |
| serializer_class = BookSerializer |
| |
| |
| from rest_framework import serializers |
| from .models import Book |
| class BookSerializer(serializers.ModelSerializer): |
| class Meta: |
| model = Book |
| fields = '__all__' |
| |
| |
| from rest_framework.routers import SimpleRouter |
| router = SimpleRouter() |
| router.register('books', views.BookView, 'books') |
| |
| urlpatterns = [ |
| path('admin/', admin.site.urls), |
| ] |
| |
| urlpatterns += router.urls |
5 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 加持,快人一步
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构