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交互工具用来显示字符个数。对于存储和计算机来说是相同的

posted @   Py玩家  阅读(11)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
点击右上角即可分享
微信分享提示