drf

web开发模式

前后端混合开发模式(老项目)

模板语法:dtl:django template language

模板渲染:html

前后端分离开发模式(新项目)

后端专门的后端:API接口

前端专门的前端:html,css,js --->ajax --->后端交互 --->通过调用api接口返回数据--->字符串--->转成js数组,对象,字符串

 

 

API接口

防止个人习惯差异引起的混乱,找到一个大家都觉得很好的接口实现规范,这个规范能够让后端写的接口用途一目了然,减少双方之间的合作成本。

api接口:通过网络,规定了前后台信息交互规则的url链接,也就是前后台信息交互的媒介。

-https://www.baidu.com/books/--->json 格式数据---》接口
-https://www.cnblogs.com/liuqingzheng/articles/17400599.html---》返回界面

url和接口的区别:Web API接口和一般的url链接的区别,

Web API接口简单概括有下面四大特点:

1 url:长得像返回数据的url链接
https://api.map.baidu.com/place/v2/search

2 请求方式:get、post、put、patch、delete
采用get方式请求上方接口
3 请求参数:json或xml格式的key-value类型数据
ak:6E823f587c95f0148c19993539b99295
region:上海
query:肯德基
output:json
4 响应结果:json或xml格式的数据

典型的api接口:

-url地址
-有请求方式
-携带参数
-返回格式是json,xml

https://api.map.baidu.com/place/v2/search?ak=6E823f587c95f0148c19993539b99295&region=%E4%B8%8A%E6%B5%B7&query=%E8%82%AF%E5%BE%B7%E5%9F%BA&output=json

 

接口测试工具Postman

接口测试工具

  postman:浏览器插件

  apifox:Postman +Swagger +Mock +JMeter

  postwoman

下载https://www.postman.com/

 

创建django项目

pip3 install djagno----》释放出一个可执行文件
djagno-admin startproject 项目名

关于post的使用

post的简单介绍

 

前后端传输数据的编码格式---urlencoded,formdata, json这三种格式的详解

urlencoded

 formdata

 json

 

关于一些总结

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

2、mysql中varchar和char的区别:定长和不定长

varchar 属于可变长长度,字符串数据类型,与固定长度不同,他更节省空间,根据字符串的长度改变储存空间。

char 属于固定长度字符串,规定多少长度就存多少长度。

两个的区别:char的处理速度比varchar快,所以在对速度有要求的地方,可以使用char

3、不用pycharm创建django项目:

    django—admin startproject 项目名

4、django中文件对象和原来的文件对象

-django:from django.core.files.uploadedfile import InMemoryUploadedFile
-原生文件:_io.BufferedWriter
-django中文件类没有继承原生文件类,但是有原生文件类所有方法

5、mysql--->int类型---》int(10),int(20)

int(M)只是用来显示数据的宽度,当字段被设计为int类型,范围就被写死了,与M无关。

 

restful规范

1、前后端分离要写接口---->api接口--->接口测试工具postman

2、restful规范是:一种定义we吧api接口的设计风格,尤其是用于前后端分离的应用模式中的规范

3、写接口要遵循的一个规范,restful规范--->10条

  1、数据的安全保障  :url链接一般采用的是https协议进行传输,因为比http安全

  2、接口特征表现:url带有api标识  

      -https://api.baidu.com/books/
      -https://www.baidu.com/api/books/

  3、多数据版本共存 ---->url中带版本信息

    https://api.baidu.com/v1/books
    https://www.baidu.com/api/v2/books

  4、数据即资源,均使用名词(可复数) ---> 前后台交互,交互的数据称之为资源

    数据即资源,url尽量使用名字

https://127.0.0.1/api/v1/books/  -->表示对图书操作:增加,删除,查询,修改,都用这一个地址

  5、资源操作由请求方式决定   

    -get 请求获取数据(获取所有,获取单条)
    -post 新增数据
    -put 修改数据
    -delete 删除数据

  6、请求地址中带过滤条件 --->只针对于搜索所有接口

  7、响应状态码

    http响应状态码:1xx,2xx,3xx,4xx,5xx

  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 响应中带链接

 

序列化反序列化

  序列化:数据转换格式 (序列化分为:序列化和反序列化)

  序列化的两个阶段:

      序列化:把我们识别的数据转换成指定的格式提供给别人

          例如:我们在django中获取到的数据默认是模型对象,但是模型对象数据无法直接提供给前端或者其他平台使用,所以我们需要把数据进行序列化,变成字符串或者json数据提供给别人。

      反序列化:把别人提供的数据转换或者还原成我们需要的格式

            例如:前端js传过来的是json数据,对于python而言就是字符串,我们需要进行反序列化,讲字符串转换为模型类对象,这样我们才能把数据保存在数据库里。

 

drf安装和快速使用

基于django编写符合restful规范的接口

例题:

假设以 Book 表为例,写它的5个接口
-1 查询所有
-2 新增一条
-3 修改一条
-4 删除一条
-5 查询一条

import json

from django.shortcuts import render
from django.http import JsonResponse
# Create your views here.

from django.views import View
from .models import  Book
class Bookviews(View):
    #获取全部数据
    def get(self,request,*args,**kwargs):
        booklist = Book.objects.all()
        list = []
        for i in booklist:
            list.append({'name':i.name,'price':i.price})
        res = {'code':20,'msg':'已获取数据','result':list}
        return JsonResponse(res)

    #新增数据,需要判断是不是json还是urlencoded
    def post(self,request,*args,**kwargs):
        if request.POST:
            name = request.POST.get('name')
            price = request.POST.get('price')
            list = Book.objects.create(name=name,price=price)
            back_dic = {'code':21,'msg':'添加数据成功','result':{'name':name,'price':price}}
            return JsonResponse(back_dic)
        else:
            print(request.body)   #b'{"name":"1","price":"2"}'
            #反序列化
            res = json.loads(request.body)
            print(res)
            #增加进数据库
            list = Book.objects.create(name=res['name'],price=res['price'])
            back_dic = {'code': 22, 'msg': '添加数据成功','result':{'name':res['name'],'price':res['price']}}
            return JsonResponse(back_dic)


class Bookdetialviews(View):
    #获取单个数据
    def get(self,request,pk):
        list = Book.objects.filter(pk=pk).first()
        #手动序列化
        list_b = {'name':list.name,'price':list.price}
        return JsonResponse({'code':31,'msg':'查询成功','result':list_b})

    #修改数据
    def put(self,request,pk):
        #从前端得到数据
        try:
            # print(request.body)  #'name=1&price=555'
            list = json.loads(request.body)
            # print(list)  #{'name': '1', 'price': '2'}
            # #找到对应的数据
            res = Book.objects.filter(pk=pk).first()
            res.name = list.get('name')
            res.price = list.get('price')
            res.save()
            #返回
            return JsonResponse({'code':40,'msg':'修改成功','result':{'name':res.name,'price':res.price}})
        except Exception:
            return JsonResponse({'code':41,'msg':'传输格式不是json'})

    def delete(self,request,pk):
        #找到删除的数据
        res = Book.objects.filter(pk=pk).first()
        #找到对应的数据删除
        Book.objects.filter(pk=pk).delete()
        return JsonResponse({'code':51,'msg':'删除成功','result':{'name':res.name,'price':res.price}})

 

djangorestframework: 简称drf,django的一个第三app---》方便我们快速实现符合restful规范的接口

使用步骤:

1 安装模块
1 django 是2版本,用不了drf最新(适当降版本),他会卸载django---》装最新4.x
2 djagno 3.1.12 可以使用drf最新
-django:3.1.12
-drf:3.14.0

2 在app中注册
INSTALLED_APPS = [
'rest_framework', # 一定不要忘了加 ,
]
3 写路由
from rest_framework.routers import DefaultRouter
router = DefaultRouter()
router.register('books', BookView, 'books')

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

 

posted @ 2023-08-28 16:34  别管鱼油我了  阅读(30)  评论(0编辑  收藏  举报