drf基础知识01
drf框架
"""
接口:
接口规范:
drf生命周期:
序列化组件:
三大认证组件:
过滤、筛选、排序、分页组件:
请求、响应、解析、异常模块:
jwt:
"""
"""
http协议
应用层协议
请求与响应规范:首行 - 头 - 体
特点:无状态、无连接、请求永远是客户端到服务器端、ssl
wsgi协议
原生django启动项目 - 启动了server socket - wsgiref - uWSGI(项目上线)
规定数据的解析方式:
get数据、post数据(数据数据) => request => 回调的视图函数
返回响应对象 - HTTPResponse类对象 - 数据、响应状态码
"""
接口
"""
url链接:http://api.oldboy.com/login/
请求方式:get | post | put ...
请求参数:username | password
响应结果:result | data
"""
"""
url链接如何书写、请求到底采用什么方式、规定哪些参数是必传或是选填、到底响应什么数据 => 接口规范
"""
restful接口规范
"""
1)一般都采用安全协议(接口都是操作数据的):https
2)体现接口的关键字:api
https://api.oldboy.com
https://www.oldboy.com/api
3)接口操作的数据称之为资源:采用资源名称的复数
https://api.oldboy.com/books/
https://api.oldboy.com/users/
4)接口链接中不出现操作资源的动词,通过请求方式来决定操作资源的动作
https://api.oldboy.com/books/
get:获取所有 | post:增加一个
https://api.oldboy.com/books/(?P<pk>)/
get:获取一个 | put:整体修改一个(patch:局部修改一个) | delet:删除一个
5)资源数据有多版本时,接口可以做版本控制
https://api.oldboy.com/books/v1/
https://api.oldboy.com/v2/books/
6)资源响应的限制条件:筛选、排序、限制...
https://api.oldboy.com/books/?publish=1&ordering=-price&limit=3
7)响应状态码
网络状态码:2xx | 3xx | 4xx | 5xx
数据状态码(约定的):0 | 1 | 2
{
'status': 1,
}
-- SUCCESS(0, "查询成功")
-- NODATA(1, "非正确,无数据,显示基本信息")
-- FEAILED(2, "查询失败")
8)响应结果的信息描述:
{
'status': 1,
'msg': 'login failed'
}
9)响应的结果:get所有:所有资源 | get一个:一个资源 | post、put、patch:新增、修改的资源 | delete:不做任何返回
{
'status': 0,
'msg': 'ok',
'results': [登录的用户对象序列化结果]
}
10)响应结果中有二次资源(用户头像:图片链接,用户详情:详情接口)
要表明请求二次资源的接口
注:通过 接口文档 告诉前台传递的必要和选填参数
"""
百度测试接口
安装postman
https://www.getpostman.com/downloads/
测试接口
method: GET
url: https://api.map.baidu.com/place/v2/search
params:
ak: 6E823f587c95f0148c19993539b99295
region: 上海
query: 肯德基
output: json
原生Django实现接口
创建Django项目并设置默认app名为api,完成路由分发
# 主路由
from django.conf.urls import url, include
from django.contrib import admin
urlpatterns = [
url(r'^admin/', admin.site.urls),
url(r'^api/', include('api.urls')),
]
# api应用下的子路由
from django.conf.urls import url
from . import views
urlpatterns = [
# as_view() 本质拿到 view函数地址,
# view内部通过dispatch分发请求给具体的(get|post|delete)方法处理请求
# 处理完后的响应结果会一层层返回
url(r'^books/$', views.BookView.as_view()),
url(r'^books/(?P<pk>.*)/$', views.BookView.as_view()),
]
模型层:models.py
from django.db import models
class Book(models.Model):
name = models.CharField(max_length=64)
price = models.DecimalField(max_digits=5, decimal_places=2)
class Meta:
db_table = 'old_boy_book'
verbose_name = '书籍'
verbose_name_plural = verbose_name
def __str__(self):
return self.name
数据库迁移
>: python manage.py makemigrations
>: python manage.py migrate
后台管理:admin.py
from django.contrib import admin
from . import models
admin.site.register(models.Book)
admin.site.register(models.User)
# 创建超级用户
# >: python manage.py createsuperuser
视图层:views.py
from django.views import View
from django.http import JsonResponse
from . import models
class BookView(View):
def get(self, request, *args, **kwargs):
pk = kwargs.get('pk')
if pk: # 通过是否有主键决定获取单个或是全部资源
book_dic_list = models.Book.objects.filter(pk=pk).values('name', 'price')
if not book_dic_list:
return JsonResponse({
'status': 2,
'msg': 'pk值有误',
'results': {}
})
return JsonResponse({
'status': 0,
'msg': 'ok',
'results': book_dic_list[0]
})
book_dic_list = models.Book.objects.all().values('name', 'price')
if not book_dic_list:
return JsonResponse({
'status': 2,
'msg': '无数据',
'results': {}
})
return JsonResponse({
'status': 0,
'msg': 'ok',
'results': list(book_dic_list)
})
视图层回顾
视图:models.py
class User(models.Model):
SEX_CHOICES = [
(0, '男'),
(1, '女'),
(2, '哇塞')
]
username = models.CharField(max_length=64)
password = models.CharField(max_length=64)
sex = models.IntegerField(choices=SEX_CHOICES, default=0)
# 需要配置media工作目录与路由
icon = models.ImageField(upload_to='icon', default='/icon/default.png')
class Meta:
db_table = 'old_boy_user'
verbose_name = '用户'
verbose_name_plural = verbose_name
def __str__(self):
return self.username
media工作目录:settings.py
# MEDIA_URL = '/media/'
MEDIA_ROOT = os.path.join(BASE_DIR, 'media')
路由:主urls.py
from django.conf.urls import url, include
from django.contrib import admin
from django.views.static import serve
from django.conf import settings
urlpatterns = [
url(r'^admin/', admin.site.urls),
url(r'^api/', include('api.urls')),
url(r'^media/(?P<path>.*)', serve, {'document_root': settings.MEDIA_ROOT})
]
drf框架
安装
>: pip3 install djangorestframework
配置:settings.py
# 注册drf app
NSTALLED_APPS = [
# ...
'rest_framework',
]
特点:
# 具体功能在具体模块下
from rest_framework.request import Request
from rest_framework.response import Response
from rest_framework.exceptions import APIException
from rest_framework.filters import OrderingFilter
from rest_framework.views import APIView
from rest_framework.pagination import PageNumberPagination
from rest_framework.settings import APISettings
# 自定义drf配置 - 在自己的settings.py
REST_FRAMEWORK = {
# 自定义修改drf的配置们
}
原生Django CBV 源码分析:View
"""
1)as_view()是入口,得到view函数地址
2)请求来了调用view函数,内部调用dispatch函数完成请求分发
3)dispatch函数将请求方式映射成视图类的同名方法,完成请求的处理,得到相应
4)再将相应的结果一层层返回
"""
drf CBV 源码分析:APIView
"""
1)as_view()是入口,得到view函数地址,在范围view函数地址时局部禁用csrf认证
2)请求来了调用view函数,内部调用(APIView类的)dispatch函数完成请求分发
3)dispatch函数 二次封装request、完成三大认证后,再将请求方式映射成视图类的同名方法,完成请求的处理,得到相应,再对相应做渲染处理
4)再将相应的结果一层层返回
"""
响应渲染模块:json和浏览器接口页面
# 入口:APIView类的dispatch函数
self.response = self.finalize_response(request, response, *args, **kwargs)
->
neg = self.perform_content_negotiation(request, force=True)
->
renderers = self.get_renderers()
->
self.renderer_classes
->
APISetting:DEFAULT_RENDERER_CLASSES
局部配置
from rest_framework.views import APIView
from rest_framework.response import Response
from rest_framework.renderers import JSONRenderer
from rest_framework.renderers import BrowsableAPIRenderer
class UserAPIView(APIView):
# 局部配置:只有该视图类起作用
renderer_classes = [JSONRenderer] # 只提供JSON数据渲染
pass
全局配置
# drf配置
REST_FRAMEWORK = {
# 响应的渲染模块
'DEFAULT_RENDERER_CLASSES': [
'rest_framework.renderers.JSONRenderer',
'rest_framework.renderers.BrowsableAPIRenderer',
],
}
请求数据解析模块:json、form-data、urlencoding
# 入口:APIView类的dispatch函数
request = self.initialize_request(request, *args, **kwargs)
->
parsers=self.get_parsers()
->
self.parser_classes
->
APISetting:DEFAULT_PARSER_CLASSES
局部配置
from rest_framework.views import APIView
from rest_framework.response import Response
from rest_framework.parsers import JSONParser
from rest_framework.parsers import FormParser
from rest_framework.parsers import MultiPartParser
class UserAPIView(APIView):
# 局部配置:只有该视图类起作用
parser_classes = [JSONParser] # 只提供JSON解析
pass
全局配置
# drf配置
REST_FRAMEWORK = {
# 响应的渲染模块
'DEFAULT_RENDERER_CLASSES': [
'rest_framework.renderers.JSONRenderer',
'rest_framework.renderers.BrowsableAPIRenderer',
],
# 请求数据解析模块
'DEFAULT_PARSER_CLASSES': [
'rest_framework.parsers.JSONParser', # 'application/json'
'rest_framework.parsers.FormParser', # 'application/x-www-form-urlencoded'
'rest_framework.parsers.MultiPartParser' # multipart/form-data
],
}
请求数据解析位置
# 请求的数据包:均解析到 request.data 中
# 请求的?文件参数:均解析到 request.query_params 中
响应模块
# 响应可以设置响应数据、响应网络状态码、响应头、响应数据类型等
data = {
'status': 0,
'msg': 'get ok',
'results': [],
'token': '123.12321.231'
}
return Response(
data=data,
status=status.HTTP_200_OK,
headers={'Token': '123as.masd21.asd213sd'},
content_type='application/json' # 默认就是application/json
)
drf基础知识01的更多相关文章
- AI-图像基础知识-01
目前人工智能Artificial Intelligence主要分为两大分支: 计算机视常见:Computer Vision,简称CV CV主要是研究如何让机器看懂世界的一种技术,通过各种光 ...
- MongoDB基础知识 01
MongoDB基础知识 1. 文档 文档是MongoDB中的数据的基本单元,类似于关系型数据库管理系统的行. 文档是键值对的一个有序集.通常包含一个或者多个键值对. 例如: {”greeting& ...
- CSS基础知识01
一.CSS基础知识介绍 1.css是cascading style sheet层叠式样式表的简写 2.css小用法 加粗:font-weight:bold; 正常用:norma ...
- python基础知识 01
一.计算机基础知识 计算机有硬件+操作系统+软件应用组成 cpu:人的大脑 内存:人的临时记忆 硬盘:人的永久记忆 操作系统 控制计算机硬件工作的流程 应用程序 安装在操作系统上的软件 二.Pytho ...
- Jquery基础知识01
1:$(document).ready()function{}和window.onload()的区别. 1:$(document).ready()function{} 该方法等到Dom结构绘制完毕 ...
- Java基础知识01
1. String,StringBuffer和StringBuilder的区别? String:final修饰,String对象创建后不可修改:StringBuffer和StringBuilder对象 ...
- .NET基础知识(01)-值类型与引用类型
常见面试题目: 1. 值类型和引用类型的区别? 2. 结构和类的区别? 3. delegate是引用类型还是值类型?enum.int[]和string呢? 4. 堆和栈的区别? 5. 什么情况下会在堆 ...
- C#基础知识01(continue、break 和 return、ref 和 out)
break[跳出循环或者退出一个switch语句]由于它是用来退出循环或者switch语句的,所以只有当它出现在这些语句中时才是合法的. continue 语句和break语句相似,只是它不是退出一个 ...
- 3-14 JS基础知识01
JavaScript的组成: JS特点:JS是一门 脚本语言:不需要编译编译:把代码转化成计算机所认知的二进制语言.JS是一门弱类型语言:声明变量都用varJS是一种动态语言:认知当前的着这个变量到底 ...
随机推荐
- Linux - Shell - 替换文件名中的空格
概述 使用 shell 替换 文件名中的空格 背景 尝试用 find 配合 xargs, 在多个文件里找关键字 出现了问题 有空格的文件名, 并不是很好处理 准备 os centos7 1. 问题: ...
- 赋值SQL语句
UPDATE TAB_DEV_MS SET DT_DETECTION_STARTTIME = TO_DATE ( '2017-01-01 00:00:00', 'YYYY-MM-DD HH24:MI: ...
- document.getElementById("id").value与$("#id").val()之间的区别
本文链接:https://blog.csdn.net/mottohlm/article/details/78364196....今天在项目中遇到这么一个JS报错:原因是代码中有这么一段:对,就是var ...
- 三分钟快速上手TensorFlow 2.0 (下)——模型的部署 、大规模训练、加速
前文:三分钟快速上手TensorFlow 2.0 (中)——常用模块和模型的部署 TensorFlow 模型导出 使用 SavedModel 完整导出模型 不仅包含参数的权值,还包含计算的流程(即计算 ...
- Having用法以及其和Where区别
例如,进行分组语句: select year,count(id) num from tblPlantProduce group by year 在这条语句中若要筛选出年份>2005年的有两种方式 ...
- LUT
FPGA大多为LUT+寄存器的够,实现工艺为SRAM:寄存器很好理解,存储器的一种,用于存储指令和数据,多位于CPU内.拿什么是LUT呢? LUT:即Look up table,查找表,其本质是一个R ...
- 开发笔记—钉钉服务商应用isv开发,从应用配置,到获取客户企业通讯录
以第三方企业微应用为例 在第三方企业微应用应用时,比较底层的需求,就是应用需要获取客户企业的通讯录,即部门/员工的数据.本人整理以下几个关键数据,供大家开发参考. 新建第三方微应用时,能拿到这些初始数 ...
- ClassLoad
是什么 用来加载 Class 的.它负责将 Class 的字节码形式转换成内存形式的 Class 对象.字节码可以来自于磁盘文件 .class,也可以是 jar 包里的 .class,也可以来自远程服 ...
- 调用百度地图api隐藏版权信息
调用百度地图API隐藏右下角版权信息 商用的话建议不要隐藏,避免侵权. 隐藏前: 隐藏后: .BMap_cpyCtrl { display: none; } .anchorBL { display: ...
- 劳动人民万岁(拒绝惰性)------- 浅谈迭代对象(Iterable) 迭代器(Iterator)
一.前戏 问题:如果一次抓取所有城市天气 再显示,显示第一个城市气温时有很高的延时,并且很浪费储存空间 解决方案:以“用时访问”策略,并且能把说有城市气温封装到一个对象里,可用for一句进行迭代 二. ...