drf-day2

发布时间 2023-08-29 15:27:07作者: Py玩家

昨日作业

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__"