DC's blog DC's blog
首页
  • 计算机基础
  • linux基础
  • mysql
  • git
  • 数据结构与算法
  • axure
  • english
  • docker
  • opp
  • oop
  • 网络并发编程
  • 不基础的py基础
  • 设计模式
  • html
  • css
  • javascript
  • jquery
  • UI
  • 第一次学vue
  • 第二次学vue
  • Django
  • drf
  • drf_re
  • 温故知新
  • flask
  • 前后端不分离

    • BBS
    • 订单系统
    • CRM
  • 前后端部分分离

    • pear-admin-flask
    • pear-admin-django
  • 前后端分离

    • 供应链系统
  • 理论基础
  • py数据分析包
  • 机器学习
  • 深度学习
  • 华中科大的网课
  • cursor
  • deepseek
  • 杂文
  • 罗老师语录
  • 关于我

    • me
  • 分类
  • 归档
GitHub (opens new window)

DC

愿我一生欢喜,不为世俗所及.
首页
  • 计算机基础
  • linux基础
  • mysql
  • git
  • 数据结构与算法
  • axure
  • english
  • docker
  • opp
  • oop
  • 网络并发编程
  • 不基础的py基础
  • 设计模式
  • html
  • css
  • javascript
  • jquery
  • UI
  • 第一次学vue
  • 第二次学vue
  • Django
  • drf
  • drf_re
  • 温故知新
  • flask
  • 前后端不分离

    • BBS
    • 订单系统
    • CRM
  • 前后端部分分离

    • pear-admin-flask
    • pear-admin-django
  • 前后端分离

    • 供应链系统
  • 理论基础
  • py数据分析包
  • 机器学习
  • 深度学习
  • 华中科大的网课
  • cursor
  • deepseek
  • 杂文
  • 罗老师语录
  • 关于我

    • me
  • 分类
  • 归档
GitHub (opens new window)
  • Django

  • 第一次学drf

    • Postman和restful
      • POSTMAN的使用****
        • web开发模式
        • GET请求
        • POST请求
        • 实验验证
        • get
        • urlencoded
        • formdata
        • json
        • 总结
      • restful规范*****
      • 序列化和反序列化**
      • drf介绍和安装**
    • APIView
    • Serializer
    • ModelSerializer
    • drf的请求与响应
    • drf的视图组件
    • drf的路由组件
    • 认证权限频率
    • 过滤排序分页异常
    • 源码分析
    • jwt
    • 大回顾
    • 零散的知识点
  • 第二次学drf

  • 温故知新

  • flask

  • 后端
  • 第一次学drf
DC
2023-03-29
目录

Postman和restful

# POSTMAN的使用****

API接口: 前后台信息交互的媒介
POSTMAN -- 接口测试工具

postman还可以进行接口的批量测试, 导出导入测试文件..

下载地址: https://www.postman.com/downloads/

# web开发模式

python后端开发,提供API接口,返回Json格式的数据..  
前后端不分离的混合开发模式 ; 前后端分离
1
2

# GET请求

?name=lqz&age=19 request.GET接收

# POST请求

★ Post请求携带的Body请求体里提交到后端的数据, 对其常用的<编码格式>有3种!

即POST以 什么样子/什么编码格式 组织数据提交到后端!

首先要明确!
   POST的请求方式才会有请求体,GET请求是没有请求体的!!
   POST请求的参数放在请求体里,无大小限制;GET请求的参数放到URL地址中,有大小限制(小于1k)!!

1> urlencoded(默认) -- request.POST
   会用&符号作为分隔符组织多组k-v数据放到请求体中,提交到后端
   eg: hobby=篮球&hobby=足球&aa=aa  # -- 会对汉字篮球足球进行编码!
2> formdata  -- 普通数据部分 request.POST; 文件部分 request.FILES
   既可以传文件,又可以传普通数据
   其在请求体中的格式如下(了解):
      普通数据部分"name=egon&age=18" + 文件部分"先以--flakjfalk--作为分割,然后是文件的二进制数据"
      有分割后,就能清楚的知道从哪开始读文件.
   Ps:form表单元素在使用包含文件上传的表单控件时,必须给表单元素的enctype属性设置该值
3> json
   json格式的数据直接放到请求体中 
   eg: {"name":"egon","age":19}
   注意!POST请求提交到Django后端的json格式的数据,request.POST是接受不到的!!!
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17

# 实验验证

创建Django项目drf_day01.并创建app01,写一个路由/index和对应的视图函数index.注释掉csrf中间件!

from django.conf.urls import url
from django.contrib import admin
from app01 import views

urlpatterns = [
    url(r'^admin/', admin.site.urls),
    url(r'^index/', views.index),
]


# --- # --- # --- # --- #


from django.shortcuts import render, HttpResponse


def index(request):
    print("request.GET   >>:", request.GET)
    print("request.POST  >>:", request.POST)
    print("request.FILES >>:", request.FILES)
    print("request.body  >>:", request.body)  # -- ★ 接收请求体里的内容
    return HttpResponse('ok')
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
# get

在POSTMAN中发送get请求, http://127.0.0.1:8000/index/?name=lqz&name=dc ,后端结果如下:

request.GET   >>: <QueryDict: {'name': ['lqz', 'dc']}>
request.POST  >>: <QueryDict: {}>
request.FILES >>: <MultiValueDict: {}>
request.body  >>: b''
  

思考:若将request.GET的结果看作一个字典,按照字典的规则,request.GET.get('name')得到的应该是['lqz','dc']
然而真实得到的是'dc',So,request.GET可以当作字典用,但实际上它不是个字典!!
print(request.GET.get('name'))      # dc  --  取到的是最后一个
print(request.GET.getlist('name'))  # ['lqz', 'dc']

补充: request.GET肯定是某个类的实例化对象!通过type(request.GET)查看该实例对应的类!
print(type(request.GET))  # <class 'django.http.request.QueryDict'>
from django.http.request import QueryDict  
command+b查看QueryDict类的源码发现该类的父类继承了dict类!!So,它可以当作字典用,但比字典更强大!
实验证明,request.GET、request.POST都是QueryDict类的实例对象!!request.FILES是MultiValueDict类的实例.
***
扩展作业,我们也能实现类似的功能,写一个类,用起来跟字典一样,但是要有obj.getlist方法.get取最后一个,getlist取所有.
   -- 继承dict
   -- 重写__getattr__方法,点拦截
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
# urlencoded

在POSTMAN中发送post请求, http://127.0.0.1:8000/index/?name=lqz&name=dc;
并在body请求体中添加urlencoded格式的数据,后端结果如下:

request.GET   >>: <QueryDict: {'name': ['lqz', 'dc']}>
request.POST  >>: <QueryDict: {'hobby': ['篮球'], 'aa': ['aa']}>
request.FILES >>: <MultiValueDict: {}>
request.body  >>: b'hobby=%E7%AF%AE%E7%90%83&aa=aa'  # -- 对汉字篮球进行了编码
1
2
3
4
# formdata

注意: 如果传的是文件, body体是不能被打印的!! 打印会报错.

request.GET   >>: <QueryDict: {'name': ['lqz', 'dc']}>
request.POST  >>: <QueryDict: {'name': ['路飞']}>
request.FILES >>: <MultiValueDict: {'myfile': [
                                        <InMemoryUploadedFile: 111.jpg (image/jpeg)>, 
                                        <InMemoryUploadedFile: 222.jpg (image/jpeg)>]}>
1
2
3
4
5
# json

注意: request.POST是取不到json格式的数据的!!

request.GET   >>: <QueryDict: {'name': ['lqz', 'dc']}>
request.POST  >>: <QueryDict: {}>
request.FILES >>: <MultiValueDict: {}>
request.body  >>: b'{"name":"egon","age":19}'
1
2
3
4

为什么request.POST是取不到json格式的数据?
因为Django的开发者没有写!!他只写了urlencoded和formdata格式的, json格式数据的接收需要我们自己写!!

我们可以写一个装饰器,加到视图函数上,无论前端 POST请求 传过来的数据是哪个格式的编码,Django都从request.data中获取!!
实现思路: 从request.body是否报错出发..

# 总结

1> GET请求 -- 在url中的表现形式?name=lqz&age=19, Django后端通过request.GET进行接收 -- QueryDict对象 
2> POST请求分三种编码方式

编码格式 在body请求体中的存放形式 Django中接收数据
urlencoded hobby=篮球&hobby=足球&aa=aa request.POST -- QueryDict对象
formdata 普通数据部分"hobby=篮球&hobby=足球&aa=aa"
文件部分"--flakjfalk--作为分割 + 文件的二进制数据"
普通数据部分: request.POST -- QueryDict对象
文件数据部分: request.FILES -- MultiValueDict对象
若传的是文件, body体是不能被打印的,打印会报错
json {"name":"egon","age":19} Django中没有写好的对象来接收,需要自己写

3> request.GET、request.POST、request.FILES 对象都可以接收key值相同的多个数据!!
取的时候,obj.get取最后一个,obj.getlist取所有!!

Ps: 之所以没有展示上传文件,因为上传文件的话,request.body打印不了!


# restful规范*****

RESTful是一种定义 API接口的设计风格 , 尤其适用于前后端分离的应用模式中!! 共有10条!

1. 保证数据安全,通常使用https进行交互! 
   https比http安全,https=http+ssl
  
2. 接口中带api关键字来表示该url是api接口
   https://api.baidu.com
   https://www.baidu.com/api
    
3. url链接中带接口版本
	 https://api.baidu.com/v1
	 https://api.baidu.com/v2
   举个例子,刚开始登陆只需要用户和密码,上线积累一些用户后,现登陆功能需要加上验证码
           为了保证已有用户能使用老版本的登陆,新开放一个v2版本的登陆接口.
    
4. ★ 数据即是资源,均使用名词(可复数)
   eg:取所有的图书
      https://api.baidu.com/v1/books (☑️)
      https://api.baidu.com/v1/get_books (❌)
      一般提倡用资源的复数形式,在url链接中<尽量>不要出现操作资源的动词
      
5. ★ 资源操作由请求方式决定(method)
   1> 获取数据 get
   2> 新增数据 post
   3> 删除数据 delete
   4> 修改数据 put/patch put是全局修改,patch是局部修改
   https://api.baidu.com/books-get      获取所有图书
   https://api.baidu.com/books/1-get    获取主键为1的图书
   https://api.baidu.com/books/1-delete 删除主键为1的图书
    
6. 在url中带搜索、过滤、排序条件
   https://api.example.com/v1/zoos?page=2&per_page=100    指定第几页,以及每页的记录数
   https://api.example.com/v1/zoos?sortby=name&order=asc  指定返回结果按照哪个属性排序,以及排序顺序
    
7. 响应中带状态码
   1> http响应中自带状态码:
       1开头请求正在处理;2开头请求成功;3开头重定向;4开头客户端错误;5开头服务端错误.
       200 -- 常规请求成功
       201 -- 创建成功
       301 -- 永久重定向,表示访问的资源永久不在啦
       302 -- 暂时重定向
       403 -- 请求无权限
       404 -- 请求路径不存在
       405 -- 请求方法不存在
       500 -- 服务器异常
    2> 返回的json数据中也带状态码!根据业务需求自己定制的!

8. 响应的json格式的数据中带错误信息
   eg: {"code":1000,"msg":"缺少必要字段"}

9. 针对不同操作,服务器向用户返回的结果应该符合以下规范
   GET /book          :返回资源对象的列表(数组)
   GET /books/1       :返回单个资源对象
   POST /books        :返回新生成的资源对象
   PUT /books/2       :返回完整的资源对象
   PATCH /books/2     :返回完整的资源对象
   DELETE /books/1    :返回一个空文档      
    
10.响应中带链接
   eg: 图片的链接地址
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58

# 序列化和反序列化**

api接口开发, 最核心最常见的一个过程就是序列化, 所谓序列化就是把 数据转换格式 , 序列化可以分两个阶段:

序列化:
     把我们的数据转换成别人指定的格式提供给他. eg: dict --> json

反序列化:
     把别人提供的数据(一般为json格式)转换/还原成我们需要的格式. eg: json --> dict


# drf介绍和安装**

drf(Django REST framework) 是django的一个 第三方app.
使用它可以快速的写出符合restful规范的接口!

注意,最新版本的drf不支持Django1.x啦!! So,接下来的Django项目我们都使用Django2.x..

先升级pycharm里的Django版本为2.2.2.. 再安装djangorestframework==3.12.4 ... (注意,升级完后,Django1.x的项目什么都不用改,是向下兼容,可以使用的!!)
Django2.x的版本路由就不推荐用url啦,推荐用path和url_path!! from django.urls import path,re_path

DRF的特点如下:

提供了定义序列化器Serializer的方法,可以快速根据 Django ORM 或者其它库自动序列化/反序列化;
提供了丰富的类视图、Mixin扩展类,简化视图的编写;
丰富的定制层级:函数视图、类视图、视图集合到自动生成 API,满足各种需要;
多种身份认证和权限认证方式的支持;[jwt]
内置了限流系统;
直观的 API web 界面;
可扩展性,插件丰富
1
2
3
4
5
6
7

测试Demo
APIView

← 测试Demo APIView→

最近更新
01
deepseek本地部署+知识库
02-17
02
实操-微信小程序
02-14
03
教学-cursor深度探讨
02-13
更多文章>
Theme by Vdoing | Copyright © 2023-2025 DC | One Piece
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式