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&lt;pk&gt;.*)/\)', 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)的更多相关文章

  1. DRF框架之认证组件用法(第四天)

    1. 什么是drf 框架的认证组件: auth 就等于是jango中的Auth模块,Auth是自带session信息,但是 drf的认证组件可以自定义token携带过去,去判断用的 2.如何实现认证呢 ...

  2. DRF框架之视图方法的几个封装好的模块介绍(第三天)

    1.DRF框架给我们封装好了好多层模块的 来实现简便接口的编写 # from rest_framework.mixins import CreateModelMixin, UpdateModelMix ...

  3. 一、restful规范 二、CBV(View)源代码执行流程 三、drf框架安装和简单使用

    一.restful规范 ''' 它是一个规范,面向资源架构 十条规范 1.API与用户的通讯协议,总是使用HTTPs协议,确保了网络传输的安全性 2.域名 --https://api.example. ...

  4. DRF框架之 serializers 序列化组件

    1. 什么是序列化,其实在python中我们就学了序列化工具json工具,就是吧信息存为类字典形式 2. DRF框架自带序列化的工具: serializers 3. DRF框架 serializers ...

  5. DRF框架简介(第一天)

    1.drf框架全称 djangorestframework 1.如何安装drf框架: pip3 install djangorestframework #drf框架其实就是一个app称之为drf #d ...

  6. 写写Django中DRF框架概述以及序列化器对象serializer的构造方法以及使用

    写写Django中DRF框架概述以及序列化器对象serializer的构造方法以及使用 一.了解什么是DRF DRF: Django REST framework Django REST framew ...

  7. django drf框架中的user验证以及JWT拓展的介绍

    登录注册是几乎所有网站都需要去做的接口,而说到登录,自然也就涉及到验证以及用户登录状态保存,最近用DRF在做的一个关于网上商城的项目中,引入了一个拓展DRF JWT,专门用于做验证和用户状态保存.这个 ...

  8. drf 框架

    一. drf简介 drf框架,全程: django-rest framework  ,   rest是插件名字,django插件的名字叫rest,framework是框架的意思 二. 接口 在平时生活 ...

  9. DRF框架学习总结

    DRF框架安装配置及其功能概述 Django与DRF 源码视图解析 DRF框架序列化和返序列化 DRF框架serializers中ModelSerializer类简化序列化和反序列化操作 DRF源码s ...

  10. drf框架接口文档

    drf框架接口文档 REST framework可以自动帮助我们生成接口文档. 接口文档以网页的方式呈现. 自动接口文档能生成的是继承自APIView及其子类的视图. 一.安装依赖 pip insta ...

随机推荐

  1. replace into 详解 update mysql

    转replace 与 update 区分本文主要对比一下 Sqlite 中的 replace 语句和 update 语句 . 在本例中使用如下数据库表:   图1 该表的表名为student, 存储学 ...

  2. 【MongoDB学习之三】条件操作符

    环境 MongoDB 4.0 CentOS6.5_x64 一.条件操作符 (>) 大于 - $gt (<) 小于 - $lt (>=) 大于等于 - $gte (<= ) 小于 ...

  3. mysql 连接远程阿里云数据库

    一.修改mysql 数据库的远程访问权限 use mysql; SELECT HOST,user,PASSWORD FROM USER; -- 查询用户信息 UPDATE USER SET HOST= ...

  4. 解决vue项目在ie浏览器缓存问题。

    ie浏览器一直是程序员的噩梦.项目在谷歌浏览器上完美运行.在ie浏览器上,缓存问题真心恶心.后台查看了资料说在接口上加上时间戳或随机数就行了.要是这样干,工作量真心大啊.后来我对我们公司大神封装的ax ...

  5. Redis实现实时热点查询

    Redis内存淘汰 定义: 指的是用户存储的一些键被可以被Redis主动地从实例中删除,从而产生读miss的情况 机制存在原因: Redis最常见的两种应用场景为缓存和持久存储 首先要明确的一个问题是 ...

  6. PHP设计模式 - 命令模式

    命令模式:在软件系统中,“行为请求者”与“行为实现者”通常呈现一种“紧耦合”.但在某些场合,比如要对行为进行“记录.撤销/重做.事务”等处理,这种无法抵御变化的紧耦合是不合适的.在这种情况下,如何将“ ...

  7. static binding/dynamic binding

    static binding/dynamic binding class Person { private void who() { System.out.println("Inside p ...

  8. CentOS 使用 prename修改文件名大小写的方法

    1. CentOS和ubuntu的rename的命令是不一样的. CentOS的rename 使用的是c语言版本的 而ubuntu的rename使用的是 perl的版本,意味着很多ubuntu上面的扩 ...

  9. Python知识之 方法与函数、偏函数、轮询和长轮询、流量削峰、乐观锁与悲观锁

    方法与函数 函数需要手动传参self.cls,方法自动传,比如对象方法自动传self,类方法自动传cls,而函数相对而言需要手动传,比如静态绑定的函数,self是需要手动传值得,比如我们平常使用的函数 ...

  10. Python解析 算数表达式求值 栈的使用

    使用Python实现一种算数表达式求值的算法,模拟这种使用栈的方式,这是由E.W.Dijkstra在20世纪60年代发明的一种非常简单的算法.代码模拟仅仅表现一种编程思想,代码的逻辑并不完全: if ...