day70 drf初始

复习

'''
vue指令:
	v-text | v-html | v-once
	v-bind | v-on => : | @
	v-model
	v-show |v-if | v-else-if | v-else
	v-for

vue成员:
	el | template | data | method watch computed filter props components

vue文件组件:
	<tempkate>
		<div>
		...
		</div>
	</tempkate>
	<script>
		exprt default {
			...
		}
	</script>
	<style scope>
	</style>
'''

drf

DRF是一个强大灵活的Django工具包,用于在Web后台构建Restful接口

'''
Django-rest framework
drf是django的插件,所以要提前安装django
按命令:pip install djangorestframework
使用drf时,要在settings中注册
'''

接口

'''
drf:django-restframework
drf框架的作用:写接口

什么是接口:
	规定了提交请求参数的请求方式,访问其可以获取响应的反馈数据的url链接
	四部分:url链接+请求方式+请求参数+响应数据
	url:长得像返回数据的url链接
		https//api.map.baidu.com/place/v2/search
	请求方式:get  post  put  patch  delete
		采用get方式请求上方接口
	请求参数:json或xml格式的key-value类型数据
		ak:43542545cfdscds342
		region:上海
		query:肯德基
		output:json
	响应结果:json或xml格式的数据
		上方请求参数的output参数值决定了响应数据的格式
怎么写接口:
	参照某种规则(规范)书写url链接,同时根据规则制定请求方式,请求数据与响应结果
	
接口文档:
	提供给前台开发人员与测试人员查看
	Yapi
接口规范:
	webapi接口规范:restful
'''

接口文档的编写

YApi是去哪网大前端技术中心的一个开源可视化 接口管理平台。
YApi项目可以搭建在任何本地或服务器上,完成后台项目开发时的接口编写。为开发、测试等人员提供可视化的接口预览
YApi网址

restful接口规范

'''
get  post  put  patch  delete 

url链接:
	1、接口都是操作前后台数据的,所以需要保证数据的安全性 采用https协议
	
	2、接口用来操作数据,与网址(操作页面)有区别,所以用特定的关键字表示接口
	api关键字:-https://api.baidu.com
			  -https://www.baidu.com/api
			  
	3、接口操作的数据称之为 资源,在url中只体现 资源 名称(名词)。不体现操作资源的方式动词:
	常规资源接口
		-http://api.baidu.com/books/
	非常规接口-和某资源不是特别密切或者不是一种资源
		-http://api.baidu.com/login/
		-http://api.baidu.com/place/search/
		
	4、如果一个资源存在多个版本结果,在url链接中要用特定符号来兼容多版本共存
	v1  |  v2
	-http://api.baidu.com/v1/books/
	-http://api.baidu.com/v2/books/
	
	5、群资源操作:一般还有额外的限制条件,如排序、限制,限制调试、分页等等
	?限制条件
		-http://api.baidu.com/v1/books/?ordering=price&limit=3

	
请求方式
	6、五大请求方式
		get:获取单个或多个资源
			-http://api.baidu.com/books/   群查,返回多个结果对象
			-http://api.baidu.com/books/(pk)/   单查,返回单个结果对象
		
        post:新增单个或多个资源
        	-http://api.baidu.com/books/ 
			单增,提交单个数据字典,完成单增,返回单个结果对象
			群增,提供多个数据字典的数组,完成群增,返回多个结果对象
			
		put:整体修改单个或多个资源
			-http://api.baidu.com/books/   整体修改多个,提供多个数据字典的数组(数据字典中药包含主键),完成群改,返回多个结果对象
			-http://api.baidu.com/books/(pk)/   整体修改单个,提供单个数据字典(主键在url中体现),完成单改,返回单个结果对象
			
		patch局部修改单个或多个资源
			方式与put完全相同,不同的是:操作的资源如果有5个key-value键值对,put请求提供的字典必须全包含,但是patch提供的字典包含的键值对0~5个都可以
			
		delete:删除单个或多个资源
			-http://api.baidu.com/books/   多删,提供多个资源主键数据,完成群删,不做任何资源返回(一般我们会返回结果信息:成功|失败)
			-http://api.baidu.com/books/(pk)/   单删,不需要提供额外数据,完成单删,不做任何资源返回(一般我们会返回结果信息:成功|失败)
		
响应结果
	7、响应对象中要包含网络状态码(网络状态信息和网络状态码捆绑出现,不要额外设置)
		1xx:基本信息
		2xx:成功 -200基本   201新增成功
		3xx:重定向
		4xx:客户端错误 -400cuowu 请求;403请求无权限;404请求资源不存在
		5xx:服务端错误 -服务器错误
	
	8、数据状态码(一般都是前后台约定规则)
		0:成功
		1:失败 -1xx;具体失败信息(要在接口文档中明确写出)
		2:无数据 -2xx:具体无数据信息(要在接口文档中明确写出)
	
    9、数据状态信息(一般不仅仅是对数据状态码的解释,更多的是对结果的描述,给前台开发者阅读的)
    
	10、数据结果(常量、数组、字典),如果有子资源(图片、音频、视频),返回资源的url链接
		{
    		"status": 0,
    		"msg": 'ok',
    		"results": [{
    			"name": "西游记",
    			"img": "https://api.baidu.com/media/book/xyj.png"
    		}]
		}
'''

drf请求周期 -CBV

CBV源码

as_view()=>view()=>dispatch()=>视图类的视图方法get | post

#as_view
@classonlymethod
def as_view(cls, **initkwargs):
    for key in initkwargs:……  # initkwargs没有进行赋值,该逻辑不会执行 
    def view(request, *args, **kwargs):  # 请求来了完成响应的函数
        self = cls(**initkwargs)  # cls是我们自己写的类 MyLogin  self是我们自己定义的类的对象

        self.request = request  # wsgi协议包装数据后的request 
        self.args = args  # 无名分组参数
        self.kwargs = kwargs  # 有名分组参数
        return self.dispatch(request, *args, **kwargs)  # view返回什么,用户就能看到什么

    # 将请求来调用view的修改信息保存在view对象中
    view.view_class  = cls
    view.view_initkwargs = initkwargs

    # 看源码的时候一定要注意在查找属性和方法的时候先从对象自身找,再去类中查找,再去父类查找
    return view  # 返回请求调用的函数地址,进行路由绑定 base.py
#请求来了完成响应的函数
def view(request, *args, **kwargs)

#将请求来调用view的修改信息保存在view对象中
view.view_class = cls
view.view_initkwargs = initkwargs

#返回请求调用的函数地址,进行路由绑定
return view

#dispatch
def dispatch(self, request, *args, **kwargs):
    # Try to dispatch to the right method; if a method doesn't exist,
    # defer to the error handler. Also defer to the error handler if the
    # request method isn't on the approved list.
    # 判断当前请求方式在不在默认的八个方法内
    # 1.先以GET请求为例
    if request.method.lower() in self.http_method_names:
        # 利用反射去我们自己定义类的对象中查找get属性或者是方法  getattr(obj,'get')
        # handler = get方法
        handler = getattr(self, request.method.lower(), self.http_method_not_allowed)
    else:
        handler = self.http_method_not_allowed
    return handler(request, *args, **kwargs)  # 调用get方法

CBV生命周期与debug

urls.py

from app01 import views
urlpatterns = [
    # url(r'^admin/', admin.site.urls),
    url(r'^book/$',views.BookView.as_view()),
    url(r'^book/(?P<pk>)/$',views.BookView.as_view()),
]

views.py

from django.shortcuts import render
from django.http import JsonResponse
from django.views import View
from . import models


# Create your views here.
# 一个视图类可以保护常规五个请求方法:get|post|put|patch|delete
# 五个请求方法处理十个资源操作的逻辑:单群查|单群增|单群整体改|单群局部改|单群删
class BookView(View):
    def get(self, request, *args, **kwargs):
        pk = kwargs.get('pk')
        if pk:  # 单查
            book_dic = models.Book.objects.filter(pk=pk).values('name', 'price').first()
            if not book_dic:
                return JsonResponse({
                    'status': 1,
                    'msg': '单查  资源不存在'
                })
            return JsonResponse({
                'status': 0,
                'msg': '单查 ok',
                'results': book_dic
            })
        else:  # 群查
            book_query = models.Book.objects.values('name', 'price')
            book_list = list(book_query)
            return JsonResponse({
                'status': 0,
                'msg': '群查 ok',
                'results': book_list
            })

    def post(self, request, *args, **kwargs):
        return JsonResponse({
            'status': 0,
            'msg': 'put ok'
        })

    def put(self, request, *args, **kwargs):
        return JsonResponse({
            'status': 0,
            'msg': 'put ok'
        })

    def patch(self, request, *args, **kwargs):
        return JsonResponse({
            'status': 0,
            'msg': 'put ok'
        })

    def delete(self, request, *args, **kwargs):
        return JsonResponse({
            'status': 0,
            'msg': 'put ok'
        })

drf的基础组件:

请求、响应、渲染、解析、异常

drf的序列化(核心)

序列化 模型序列化 群操作序列化

drf的视图家族

视图类(常用) 视图工具类 工具视图类(常用)视图集

drf的三大认证(核心)

认证 权限 评率

drf的过滤

筛选 搜索 排序 分页 区间

原文地址:https://www.cnblogs.com/zqfzqf/p/12089023.html