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. [数据结构 - 第3章] 线性表之双向链表(C语言实现)

    一.什么是双向链表? 双向链表(double linked list)是在单链表的每个结点中,再设置一个指向其前驱结点的指针域.所以在双向链表中的结点都有两个指针域,一个指向直接后继,另一个指向直接前 ...

  2. spark + hive

    1.如何让 spark-sql 能够访问hive? 只需将hive-site.xml 放到 spark/conf 下即可,hive-site.xml 内容请参照hive集群搭建 2.要在spark 代 ...

  3. mysql8.0 grant 创建账号及权限记录

    针对 42000错误 原文:https://stackoverflow.com/questions/50177216/how-to-grant-all-privileges-to-root-user- ...

  4. mybatis异常集锦

    [Mybatis]报错:Malformed OGNL expression: name!= null and name != ' ' [Mybatis]报错:Malformed OGNL expres ...

  5. vs code 自定义配置记录

    java环境安装:https://devblogs.microsoft.com/visualstudio/announcing-visual-studio-code-java-installer/ 保 ...

  6. 用easyui实现查询条件的后端传递并自动刷新表格的两种方法

    用easyui实现查询条件的后端传递并自动刷新表格的两种方法 搜索框如下: 通过datagrid的load方法直接传递参数并自动刷新表格 通过ajax的post函数传递参数并通过loadData方法将 ...

  7. 在CAD中插入谷歌地球卫星地图

    本文主要介绍如何在CAD中插入谷歌地球卫星地图,作为参照光栅图像.谷歌地球卫星地图使用“迈高图-地图数据下载器”(以下简称:迈高图)下载.迈高图会给出相关插入参数(插入点和缩放比例),保证插入卫星地图 ...

  8. jquery下拉单选框可左右移动数据

    <!doctype html> <html> <head> <meta charset="utf-8"> <title> ...

  9. 【转】ISE——完整工程的建立

    FPGA公司主要是两个Xilinx和Altera(现intel PSG),我们目前用的ISE是Xilinx的开发套件,现在ISE更新到14.7已经不更新了,换成了另一款开发套件Vivado,也是Xil ...

  10. Python入门 .变量 常量 基础数据类型 用户输入 流程控制语句 小练习题

    # 2.name = input(“>>>”)通过代码来验证name变量是什么数据类型?--str name = input(">>>") pr ...