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. 通Shell获取Tomcat进程号并杀死进程

    #!/bin/bash echo "begin get tomcat8 pid" tomcat8_id=$( | grep -v grep | awk '{print $2}') ...

  2. 错误: 找不到或无法加载主类 java操作hbase出错

    用java操作hbase 利用maven引入hbase包后发现无法启动程序,然后网上说是包的冲突. 我引入了下面三个包然后程序就不能运行了. <dependency> <groupI ...

  3. lvm的一些特殊命令

    pvscan --cache # 将lvm信息同步到其他节点 ......未完待续

  4. 【笔试题】Java Data Types

    Java 知识测试 Java Data Types Question 1 Predict the output of the following program. class Test { publi ...

  5. LeetCode 1046. 最后一块石头的重量(1046. Last Stone Weight) 50

    1046. 最后一块石头的重量 1046. Last Stone Weight 题目描述 每日一算法2019/6/22Day 50LeetCode1046. Last Stone Weight Jav ...

  6. 如何自己手动修改win10磁贴背景颜色?

    前言 当我们安装完应用后,可以选择将应用图标固定到"开始"屏幕,于是就会产生一个磁贴,有的应用会自带背景颜色,有的则是默认的主题色.其实这个只不过是应用本身没有没有去适配win10 ...

  7. Lock Free (无锁并发)

    CAS( compare and swap) 原子操作,保证了如果需要更新的地址没有被其他进程(线程)改动过,那么它可以安全的写入.而这也是我们对于某个数据或者数据结构加锁要保护的内容,保证读写的一致 ...

  8. C++ 工程师养成 每日一题third (子数列排序)

    题目: 定义排序子序列为一个数组中一段连续的子序列,并且这段子序列是非递增或者非递减排序的.牛牛有一个长度为n的整数数组A,他现在有一个任务是把数组A分为若干段排序子序列,牛牛想知道他最少可以把这个数 ...

  9. [cf 1236 E] Alice and the Unfair Game

    题意: 给定一个长度为m的序列$A$,你有一个长度为n的棋盘,可以任选一个位置x作为起点. 在时刻$[1,m+1]$你可以向左或向右移动一格. 设时刻i你移动后所在的位置为$B_i$,你需要满足对于任 ...

  10. C ProcessAsUser

    class Interop { public static void CreateProcess(string app, string path) { bool result; IntPtr hTok ...