drf-day2
昨日作业
1 用django写个demo---》postman测试
1 、传用户名密码到后端,查询数据库,都对了---》返回json格式{code:100,msg:登录成功}---》urlencoded
2、 打印 request.POST
3 、打印 request.body
2 写一个接口,可以长传文件{code:100,msg:上传成功}
request.POST---->有没有取决于前端传没传数据
request.body--->小文件没事,大文件报错
3 扩展作业(学的好的)
测:json格式---》request.POST 取不到
request.data 默认没有---》(装饰器)--->无论前端什么格式:josn,urlencoded---》都取出来,是字典
@xxxx
def Inde(request):
request.data
昨日总结
1 前端不同编码格式:
urlencoded: body体中 :username=lqz&password=123 django 的request.POST取出值
json: body体中 :{"username":"lqz","password":"123"} django 的request.POST取不出值
form-data:body中格式固定:数据部分和文件部分--》request.POST能取出数据,取不出文件,文件都是从request.FILES
'----------------------------789048583058585187025897\r\nContent-Disposition: form-data; name="username"\r\n\r\nlqz\r\n文件二进制
2 mysql中varchar和char的区别:定长与不定长
1、char是一种固定长度的类型,无论储存的数据有多少都会固定长度,如果插入的长度小于定义长度,则可以用空格进行填充。而varchar(有一个标志的头)是一种可变长度的类型,当插入的长度小于定义长度时,插入多长就存多长。
2、最大长度:char最大长度是255字符,varchar最大长度是65535个字节。
3、char会浪费空间,varchar会更加节省空间。
3 不用pycharm创建django 项目:
django-admin startproject 项目名
4 django中的文件对象和原来的文件对象
django:from django.core.files.uploadedfile import InMemoryUploadedFile
原生文件:_io.BufferedWriter
django中文件类没有继承原生文件类,但是有原生文件类所有方法
5 装饰器模版
def warpper_request(func): def inner( *args, **kwargs): # 在执行被装饰函数前执行 res = func(*args, **kwargs) # 在执行被装饰函数后执行 return res return inner
restful规范
1.restful规范是什么,如何来的?
一种定义Web API接口的设计风格,尤其适用于前后端分离的应用模式中 的规范
Roy Fielding的博士论文提出的
2.以后写api接口都要遵循restful规范
1、数据安全性,我们要使用https协议,不使用http,因为https比http安全
2、接口特征的表现,url带有api标识
1.https://api.baidu.com/books/
2.https://www.baidu.com/api/books/
3、多版本数据共存,也就是在url中要带有版本信息
1.https://api.baidu.com/v1/books
2.https://www.baidu.com/api/v2/books
4、数据即资源,均使用名词(复数),前后台交互的数据称之为资源,URL尽量使用名词
https://127.0.0.1/api/v1/books/(表示对图书操作:增加,删除,查询,修改,都用这一个地址)
https://127.0.0.1/api/v1/get_all_books/ (不符合restful规范)
https://127.0.0.1/api/v1/delete_books/(不符合restful规范)
5、资源操作由请求方式来决定
get 请求获取数据(获取所有,获取单条)
post 新增数据
put 修改数据
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 - delete请求:删除主键为1的书
6、请求方式带过滤条件(只针对查询所有)
7、响应状态码
http响应状态码: 1xx,2xx,3xx,4xx,5xx:https://www.sohu.com/a/278045231_120014184
404和403 和 405
403:服务器收到请求但拒绝提供服务
404:找不到url
405:请求方式有误(post请求却用了get请求)
301和302
301:永久重定向
302:临时重定向
1xx表示请求正在处理(前端一般看不到)
2xx 表示请求处理成功(经常看到)
201和200有什么区别
200:常规请求成功
201:请求成功并创建新的资源
3xx:重定向
4xx:客户端错误
5xx:服务端出错
成功都返回200,而在响应体中带 状态码--->code不同公司就不一样
{"code": 101,"msg": "用户名或密码错误"}
补充一:mysql 错误操作都会有个 数字(10060) 文字解释
8、响应状态中带错误信息
{‘code’:101,‘msg’:‘用户名或密码错误’}
9、不同操作返回格式不同
GET /collection:返回资源对象的列表(数组)
[{name:西游记,price:19},{name:三国,price:19}]
GET /collection/resource:返回单个资源对象
{name:三国,price:19}
POST /collection:返回新生成的资源对象
{name:三国,price:19}
PUT /collection/resource:返回完整的资源对象
{name:三国演绎,price:19}
DELETE /collection/resource:返回一个空文档
但一般都是这样做:
{code:100,msg:查询成功,restult:[{name:西游记,price:19},{name:三国,price:19}]}
10、响应带连接
{code:100,msg:查询成功,restult:[{name:西游记,price:19},{name:三国,price:19}] ,url:/login/}
序列化与反序列化
序列化:数据之间格式的转换
序列化: 把我们识别的数据转换成指定的格式提供给别人。
例如:我们在django中获取到的数据默认是模型对象,但是模型对象数据无法直接提供给前端或别的平台使用,所以我们需要把数据进行序列化,变成字符串或者json数据,提供给别人。
反序列化:把别人提供的数据转换/还原成我们需要的格式。
例如:前端js提供过来的json数据,对于python而言就是字符串,我们需要进行反序列化换成模型类对象,这样我们才能把数据保存到数据库中
drf的安装与快速使用
1、假设以 Book 表为例,写它的5个接口
1 查询所有
2 新增一条
3 修改一条
4 删除一条
5 查询一条
2、原生Django,五个接口
@method_decorator(decorator, name='post') class BookView(View): # 查询所有书籍 def get(self, request): book_obj = models.Book.objects.all() l = [] for item in book_obj: l.append({'name': item.name, 'price': item.price}) back_obj = {'code': 200, 'msg': '查询成功', 'data': l} return JsonResponse(back_obj) # 添加书籍 def post(self, request): name = request.data.get('name') price = request.data.get('price') models.Book.objects.create(name=name, price=price) back_obj = {'code': 200, 'msg': '添加成功', 'data': {'name': name, 'price': price}} return JsonResponse(back_obj) class BookDtailView(View): # 查询一本书籍 def get(self, request, pk): book_obj = models.Book.objects.filter(pk=pk).first() back_obj = {'code': 200, 'msg': '查询成功', 'data': {'name': book_obj.name, 'price': book_obj.price}} if not book_obj: back_obj['code'] = 1001 back_obj['msg'] = '书籍不存在' return JsonResponse(back_obj) # 修改书籍 def put(self, request, pk): data_obj = json.loads(request.body) name = data_obj.get('name') price = data_obj.get('price') book_obj = models.Book.objects.filter(pk=pk).first() back_obj = {'code': 200, 'msg': '查询成功'} if not book_obj: back_obj['code'] = 1002 back_obj['msg'] = '书籍不存在' book_obj.name = name book_obj.price = price book_obj.save() back_obj['data'] = {'name': book_obj.name, 'price': book_obj.price} return JsonResponse(back_obj) def delete(self, request, pk): book_obj = models.Book.objects.filter(pk=pk).first() back_obj = {} if not book_obj: back_obj['code'] = 1003 back_obj['msg'] = '书籍不存在' book_obj.delete() return JsonResponse(back_obj)
3、使用步骤:
1.安装模块
django 是2版本,用不了drf最新(适当降版本),他会卸载django---》装最新4.x djagno 3.1.12 可以使用drf最新 django:3.1.12 drf:3.14.0
2.在setting中app注册
INSTALLED_APPS = [ 'rest_framework', # 一定不要忘了加 , ]
3.写路由
from rest_framework.routers import DefaultRouter router = DefaultRouter() router.register('books', BookView, 'books') urls=[] urlpatterns += router.urls
4.写视图类
from rest_framework.viewsets import ModelViewSet from .serializer import BookSerializer class BookView(ModelViewSet): queryset = Book.objects.all() serializer_class = BookSerializer
5.写序列化类(创建一个serializer.py文件)
from app01 import models
from rest_framework import serializers
class BookSerializer(serializers.ModelSerializer):
class Meta:
model = models.Book
fields = "__all__"
5、 扩展:mysql中int(10)和int(20)的区别
mysql int10和int20其实是没有区别的,对于大多数的应用是没有意义的,后面数据只是我们看到的宽度,它不会限制值的合法范围,只是规定了一些mysql交互工具用来显示字符个数。对于存储和计算机来说是相同的
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY