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、使用步骤:
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.写序列化类
class BookSerializer(serializers.ModelSerializer): class Meta: model = Book fields = "__all__"