drf框架(2)
drf框架
”“”接口:
接口规范:
drf的生命周期:
序列化组件:
三大认证:过滤,删选,排序组件
请求,响应,解析,异常
jwt:json web tooken
“”“
"""
http协议(非安全的,速度快):基于tcp之上的应用层协议
应用层协议-
如何交互的规范==请求与响应规范:首行 - 头 - 体
特点:无状态.无连接,所以的请求都是从客户端到服务端,ssl(安全加密机制https)
wsgi协议:
原生的django启动项目。启动了server socket -wsgiref -uWSGI(项目上线,换了底层的socket,支持并发量高的)
规定数据的解析方式:get数据,post数据 =>request=>回调的视图函数
返回响应对象:HTTPResponse类对象,redirct,JsonPonse,render(4)
返回的内容是有数据的,且还有响应状态码,
"""
restful接口规范
"""
1>一般都采用安全协议(接口都是操作数据的):https
2>提现接口的关键字:api
https://api.oldboy.com
3>接口操作的数据称之为资源:采用资源名称的复数
https://api.oldboy.com/books
4>接口链接中不出现操作资源的动词,通过请求方式来决定操作资源的动作
https://api.oldboy.com/books/
get:获取所以
post:增加一个
https://api.oldboy.com/books/(?P<pk>)/
get:获取一个
put:整体修改一个(patch局部修改一个)
delete:删除一个
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,完成路由分发
# 主路由
fromdjango.conf.urlsimporturl, include
fromdjango.contribimportadmin
urlpatterns= [
url(r'^admin/', admin.site.urls),
url(r'^api/', include('api.urls')),
]
# api应用下的子路由
fromdjango.conf.urlsimporturl
from. importviews
urlpatterns= [
# as_view() 本质拿到 view函数地址,
# view内部通过dispatch分发请求给具体的(get|post|delete)方法处理请求
# 处理完后的响应结果会一层层返回
url(r'^books/\('</span>, views.BookView.as_view()),
url(<span class="hljs-string">r'^books/(?P<pk>.*)/\)', views.BookView.as_view()),
]
模型层:models.py
fromdjango.dbimportmodels
classBook(models.Model):
name= models.CharField(max_length=64)
price= models.DecimalField(max_digits=5, decimal_places=2)
classMeta:
db_table= 'old_boy_book'
verbose_name= '书籍'
verbose_name_plural= verbose_name
def__str__(self):
returnself.name
数据库迁移
>: python manage.py makemigrations
>: python manage.py migrate
后台管理:admin.py
fromdjango.contribimportadmin
from. importmodels
admin.site.register(models.Book)
admin.site.register(models.User)
创建超级用户
>: python manage.py createsuperuser
视图层:views.py
fromdjango.viewsimportView
fromdjango.httpimportJsonResponse
from. importmodels
classBookView(View):
defget(self, request, *args, **kwargs):
pk= kwargs.get('pk')
ifpk: # 通过是否有主键决定获取单个或是全部资源
book_dic_list= models.Book.objects.filter(pk=pk).values('name', 'price')
ifnotbook_dic_list:
returnJsonResponse({
'status': 2,
'msg': 'pk值有误',
'results': {}
})
returnJsonResponse({
'status': 0,
'msg': 'ok',
'results': book_dic_list[0]
})
book_dic_list= models.Book.objects.all().values(<span class="hljs-string">'name'</span>, <span class="hljs-string">'price'</span>)
ifnotbook_dic_list:
returnJsonResponse({
<span class="hljs-string">'status'</span>: <span class="hljs-number">2</span>,
<span class="hljs-string">'msg'</span>: <span class="hljs-string">'无数据'</span>,
<span class="hljs-string">'results'</span>: {}
})
returnJsonResponse({
<span class="hljs-string">'status'</span>: <span class="hljs-number">0</span>,
<span class="hljs-string">'msg'</span>: <span class="hljs-string">'ok'</span>,
<span class="hljs-string">'results'</span>: list(book_dic_list)
})</code></pre>
视图层回顾
视图:models.py
classUser(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')
classMeta:
db_table= 'old_boy_user'
verbose_name= '用户'
verbose_name_plural= verbose_name
def__str__(self):
returnself.username
media工作目录:settings.py
# MEDIA_URL = '/media/'
MEDIA_ROOT= os.path.join(BASE_DIR, 'media')
路由:主urls.py
fromdjango.conf.urlsimporturl, include
fromdjango.contribimportadmin
fromdjango.views.staticimportserve
fromdjango.confimportsettings
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',
]
特点:
# 具体功能在具体模块下
fromrest_framework.requestimportRequest
fromrest_framework.responseimportResponse
fromrest_framework.exceptionsimportAPIException
fromrest_framework.filtersimportOrderingFilter
fromrest_framework.viewsimportAPIView
fromrest_framework.paginationimportPageNumberPagination
fromrest_framework.settingsimportAPISettings
# 自定义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
局部配置
fromrest_framework.viewsimportAPIView
fromrest_framework.responseimportResponse
fromrest_framework.renderersimportJSONRenderer
fromrest_framework.renderersimportBrowsableAPIRenderer
classUserAPIView(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'
}
returnResponse(
data=data,
status=status.HTTP_200_OK,
headers={'Token': '123as.masd21.asd213sd'},
content_type='application/json' # 默认就是application/json
)
drf框架(2)的更多相关文章
- DRF框架之认证组件用法(第四天)
1. 什么是drf 框架的认证组件: auth 就等于是jango中的Auth模块,Auth是自带session信息,但是 drf的认证组件可以自定义token携带过去,去判断用的 2.如何实现认证呢 ...
- DRF框架之视图方法的几个封装好的模块介绍(第三天)
1.DRF框架给我们封装好了好多层模块的 来实现简便接口的编写 # from rest_framework.mixins import CreateModelMixin, UpdateModelMix ...
- 一、restful规范 二、CBV(View)源代码执行流程 三、drf框架安装和简单使用
一.restful规范 ''' 它是一个规范,面向资源架构 十条规范 1.API与用户的通讯协议,总是使用HTTPs协议,确保了网络传输的安全性 2.域名 --https://api.example. ...
- DRF框架之 serializers 序列化组件
1. 什么是序列化,其实在python中我们就学了序列化工具json工具,就是吧信息存为类字典形式 2. DRF框架自带序列化的工具: serializers 3. DRF框架 serializers ...
- DRF框架简介(第一天)
1.drf框架全称 djangorestframework 1.如何安装drf框架: pip3 install djangorestframework #drf框架其实就是一个app称之为drf #d ...
- 写写Django中DRF框架概述以及序列化器对象serializer的构造方法以及使用
写写Django中DRF框架概述以及序列化器对象serializer的构造方法以及使用 一.了解什么是DRF DRF: Django REST framework Django REST framew ...
- django drf框架中的user验证以及JWT拓展的介绍
登录注册是几乎所有网站都需要去做的接口,而说到登录,自然也就涉及到验证以及用户登录状态保存,最近用DRF在做的一个关于网上商城的项目中,引入了一个拓展DRF JWT,专门用于做验证和用户状态保存.这个 ...
- drf 框架
一. drf简介 drf框架,全程: django-rest framework , rest是插件名字,django插件的名字叫rest,framework是框架的意思 二. 接口 在平时生活 ...
- DRF框架学习总结
DRF框架安装配置及其功能概述 Django与DRF 源码视图解析 DRF框架序列化和返序列化 DRF框架serializers中ModelSerializer类简化序列化和反序列化操作 DRF源码s ...
- drf框架接口文档
drf框架接口文档 REST framework可以自动帮助我们生成接口文档. 接口文档以网页的方式呈现. 自动接口文档能生成的是继承自APIView及其子类的视图. 一.安装依赖 pip insta ...
随机推荐
- [数据结构 - 第3章] 线性表之双向链表(C语言实现)
一.什么是双向链表? 双向链表(double linked list)是在单链表的每个结点中,再设置一个指向其前驱结点的指针域.所以在双向链表中的结点都有两个指针域,一个指向直接后继,另一个指向直接前 ...
- spark + hive
1.如何让 spark-sql 能够访问hive? 只需将hive-site.xml 放到 spark/conf 下即可,hive-site.xml 内容请参照hive集群搭建 2.要在spark 代 ...
- mysql8.0 grant 创建账号及权限记录
针对 42000错误 原文:https://stackoverflow.com/questions/50177216/how-to-grant-all-privileges-to-root-user- ...
- mybatis异常集锦
[Mybatis]报错:Malformed OGNL expression: name!= null and name != ' ' [Mybatis]报错:Malformed OGNL expres ...
- vs code 自定义配置记录
java环境安装:https://devblogs.microsoft.com/visualstudio/announcing-visual-studio-code-java-installer/ 保 ...
- 用easyui实现查询条件的后端传递并自动刷新表格的两种方法
用easyui实现查询条件的后端传递并自动刷新表格的两种方法 搜索框如下: 通过datagrid的load方法直接传递参数并自动刷新表格 通过ajax的post函数传递参数并通过loadData方法将 ...
- 在CAD中插入谷歌地球卫星地图
本文主要介绍如何在CAD中插入谷歌地球卫星地图,作为参照光栅图像.谷歌地球卫星地图使用“迈高图-地图数据下载器”(以下简称:迈高图)下载.迈高图会给出相关插入参数(插入点和缩放比例),保证插入卫星地图 ...
- jquery下拉单选框可左右移动数据
<!doctype html> <html> <head> <meta charset="utf-8"> <title> ...
- 【转】ISE——完整工程的建立
FPGA公司主要是两个Xilinx和Altera(现intel PSG),我们目前用的ISE是Xilinx的开发套件,现在ISE更新到14.7已经不更新了,换成了另一款开发套件Vivado,也是Xil ...
- Python入门 .变量 常量 基础数据类型 用户输入 流程控制语句 小练习题
# 2.name = input(“>>>”)通过代码来验证name变量是什么数据类型?--str name = input(">>>") pr ...