DRF(django-rest_framework)框架
drf执行流程,APIView,Request
  -继承APIView(继承自view),重写了dispatch方法
		  -dispatch方法:1 request对象,被重新封装了,成了新的request    这个方法做的事:self.initialize_request(request, *args, **kwargs)
		  -self.initial(request, *args, **kwargs)
			  -认证,权限,频率
			  -request.POST/method....  重写了__getattr__方法 (所有封装后的request.GET等价于django view的request)
补充序列化 json模块
query_set=models.User.objects.all().values('name')
#query_set是query对象,不能直接序列化
json.dumps(list(query_set),ensure_ascii=Fales) //先转换成列表,才能序列化,ascii等于False 不显示ascii字符
(django自带序列化 from django.core import serializers)
drf序列化
serializers
source 如果是字段,会显示字段,如果是方法,会执行方法,不用加括号(authors=serializers.CharField(source='authors.all')) #获取authors跨表的所有对象
Modelserializers
class BookSerializers(serializers.ModelSerializer):
class Meta:
model = models.Book
# fields = "__all__"
fields=['nid','title','authors','publish'] #需要显示的字段,都必须添加到field是中
# exclude=('nid',) #不能跟fields同时用
# depth = 1 #深度控制,写 几 往里拿几层,层数越多,响应越慢,官方建议0--10之间,个人建议最多3层
publish=serializers.SerializerMethodField()
def get_publish(self,obj):
return obj.publish.name
authors=serializers.SerializerMethodField()
def get_authors(self,obj):
ret=obj.authors.all()
ss=AuthorSerializer(ret,many=True)
return ss.data
restframework规范10条:
--1.表示资源,路由用名词表示
--2.携带请求方法 如get post
--3.携带api ex:www.baid/api
--4.返回值带有状态码 以json格式
--5.过滤条件 在路由上携带参数
--6 错误处理,应返回错误信息,error当做key
--7 返回结果针对不同操作,返回数据格式要求
--8 返回结果中提供链接,访问具体详细
--9 API与用户通信,总是使用https协议
--10 把版本号放在请求头中(即url) 认证组件
  -drf源码中找,认证是如何实现的
			    -APIView的dispach方法---》self.initial(request, *args, **kwargs)----》400行self.perform_authentication(request)
			    ---》APIView的perform_authentication(request)----》request.user(request是新的request)
			    ---->去Request类中找user,执行--->self._authenticate()(self是新的reqeust对象)---->Request类的_authenticate(self)方法,深度
		      -使用认证功能
			        -写一个类,MyAuthetication
			        -写两个方法,一个是authenticate,一个是authenticate_header
			        -在authenticate方法中写认证逻辑,认证通过,返回空,认证不通过,抛异常
   -最终的认证使用(按照这个来)******重点*******
			  -局部使用
				    -在视图类中配置:authentication_classes=[MyAuthetication]
			  -全局使用
				    -在setting中配置:
					    REST_FRAMEWORK={
					    'DEFAULT_AUTHENTICATION_CLASSES':['app01.MyAuth.MyAuthetication',]
				    }
			  -全局使用了,局部禁用:
				    -在视图类中配置:authentication_classes=[] #查找顺序先是局部(视图),none的话去全局settings中
  权限组件
			    比如只有超级用户能访问books/这个接口
		    -使用:
			    -写一个权限类
				     from rest_framework.permissions import BasePermission
				     class MyPermissions(BasePermission):
					      def has_permission(self,request,view): #方法固定格式
						      #代表是超级用户
						      if request.user.type ==1:
							      #如何去除type对应的文字  get_字段名_display()
							      user_str=request.user.get_type_display()
							      print(user_str)
							      #超级用户,校验通过,返回true,校验失败,返回false
							      return True
						      else:
							        return False
		      -源码分析
			      APIView中的:check_permissions(self, request),进行的权限校验
		      -配置错误信息的显示
			      message='错误提示'
	  频率组件
			    同一时间段内,只能访问多少次
		    频率的使用:
			    -写一个类:
			      from rest_framework.throttling import SimpleRateThrottle
			      class MyThrottling(SimpleRateThrottle):
				      scope='xxx'
				      #必须重写get_cache_key,返回什么,频率组件会以什么做限制(比如返回ip,它就以ip做限制,如果返回user_id,它会以用户id做限制)
				      def get_cache_key(self, request, view):
					        return request.META.get('REMOTE_ADDR')
			      -在setting中配置:
				      'DEFAULT_THROTTLE_RATES': {
					      'xxx': '10/day'
				      }
from django.shortcuts import render
# Create your views here.
from rest_framework import serializers
from rest_framework.views import APIView
from rest_framework.exceptions import ValidationError
from rest_framework.response import Response
from rest import models class SourceSerializer(serializers.Serializer): name = serializers.CharField()#获取字段数据后进行序列化 def validate_name(self, value): #添加的验证规则 类似
if '草' in value:
raise ValidationError('不符合社会主义核心价值观')
return value class SourceModel(serializers.ModelSerializer):
group = serializers.CharField(source='group.num') #获取字段中不可见的内容source='get_字段_display', 比如choices中的文字 #跨表通过fk.属性名(group.num) 赋值给字段名group
class Meta: #指定表
model = models.User
fields = "__all__"
depth = 1#跨表深度(跨越一张表) from django.http import JsonResponse
from django.views import View class SourceView(APIView): def get(self, request, *args, **kwargs):
res = {"code": 0}
all_source = models.User.objects.all()
ser_obj = SourceModel(all_source, many=True)#多个字段序列需要加param:many=True
print(ser_obj.data)#获取序列化后的数据
res["data"] = ser_obj.data
return JsonResponse(res)#rest_framework中的Response 需要注册app: rest_framework 因为要条用其中api.html
from rest_framework import serializers
from rest_framework.views import APIView
from rest_framework.exceptions import ValidationError
from rest_framework.response import Response
from rest_work import models class GroupSerializer(serializers.Serializer): title = serializers.CharField()#获取字段数据后进行序列化 def validate_title(self, value): #添加的验证规则 类似
#必须先序列化,在进行验证
if '草' in value:
raise ValidationError('不符合社会主义核心价值观')
return value def update(self, instance, validated_data):
instance.name = validated_data['title']
instance.save() def create(self, validated_data):
return models.Group.objects.create(**validated_data) class SourceSerializer(serializers.Serializer): name = serializers.CharField()#获取字段数据后进行序列化
age = serializers.CharField()
# group = serializers.CharField(write_only=True)
group = serializers.SerializerMethodField() def validate_name(self, value): #添加的验证规则 类似
#必须先序列化,在进行验证
if '草' in value:
raise ValidationError('不符合社会主义核心价值观')
return value def validate_group(self, value): #注意继承serializer.Serializer,create(), update(),需要自己重写,关于外键的更新。创建,需要传入fk对应表的instance实例对象print(value) #我通过验证返回了一个,没法然会报错。 所以个人推荐用Modelserializer
return models.User.objects.filter(group=value).first().group def update(self, instance, validated_data):
instance.name = validated_data['name']
instance.email = validated_data['age']
instance.save() def create(self, validated_data):
# print(self.context['group'])
print(validated_data)
return models.User.objects.create(**validated_data) class SourceModel(serializers.ModelSerializer):
class Meta: #指定表
model = models.User
fields = "__all__" #自定义显示字段,额外的字段也必须添加到列表中 from django.http import JsonResponse
from django.views import View
class SourceView(APIView): def get(self, request, *args, **kwargs):
res = {"code": 0}
all_source = models.User.objects.all()
ser_obj = SourceSerializer(all_source, many=True)#多个字段序列需要加param:many=True
print(ser_obj.data)#获取序列化后的数据
res["data"] = ser_obj.data
return Response(res) #from rest_framework.utils.serializer_helpers import ReturnList
def post(self, *args, **kwargs):
res = {"code": 0}
# all_source = models.User.objects.all()
#ser_obj = SourceSerializer(all_source, many=True)#多个字段序列需要加param:many=True
# print(self.request.data)
ser_obj = SourceModel(data=self.request.data)
if ser_obj.is_valid():
# print(ser_obj.data)
ser_obj.save()
res['data'] = ser_obj.data
else:res['code'] = 1
#获取序列化后的数据
res["data"] = ser_obj.errors
return Response(res)

详细链接地址:https://blog.csdn.net/l_vip/article/details/79156113
DRF(django-rest_framework)框架的更多相关文章
- Python之Django rest_Framework框架源码分析
		#!/usr/bin/env python # -*- coding:utf-8 -*- from rest_framework.views import APIView from rest_fram ... 
- django  rest_framework 框架的使用
		django 的中间件 csrf Require a present and correct csrfmiddlewaretoken for POST requests that have a CSR ... 
- django  rest_framework 框架的使用02
		rest_framework 访问频率的限制(节流) 对于用户访问频率的显示,rest_framework 也有自己的类进行约束 先来一个自己的基于它的类的节流类的限制 class VisitCont ... 
- django rest_framework 框架的使用03
		rest_framework的 数据解析器 首先需要知道前端发给后端的数据格式头有哪些: media_type = 'application/json' media_type = 'applicati ... 
- Django rest_framework 实用技巧
		前言: 最近工作中需要用到Django rest_framework框架做API, 边学边写,记录了一些实际工作中需要用到的功能,不是很全也不系统,以后需要什么功能可以在这查询. 后续还会更新其它的用 ... 
- Python之Django rest_Framework(2)
		实例化: v1 = ["view.xxx.path.Role","view.xxx.path.Group",] 可以循环,循环出来的每一个不能实例化 如果把v1 ... 
- python之Django rest_framework总结
		一.rest api a.api就是接口 如: - http://www.oldboyedu.com/get_user/ - http://www. ... 
- rest_framework框架下的Django声明和生命周期
		rest_framework框架下的Django声明和生命周期 Django声明周期(request) 客户端发起请求 请求经过wsgi wsgi: 是一个协议----web服务网关接口,即在web服 ... 
- 一: DRF web应用框架基础,及序列化器的使用
		---恢复内容开始--- 一: web 应用模式(有两种) 1: 前后端不分离(前端从后端直接获取数据) 2: 前后端分离 二: api 接口 原因一: 为了在团队内部形成共识.防止个人习惯差异引起的 ... 
- DRF Django REST framework 之 路由器与版本控制组件(七)
		路由器 一些Web框架提供了用于自动确定应如何将应用程序的URL映射到处理传入请求的逻辑的功能. 而DRF的路由器组件也提供了一种简单,快速且一致的方式将视图逻辑映射到一组URL上. 路由器组件的使用 ... 
随机推荐
- 关于Visual Studio源代码文件的行尾
			我们都知道,UNIX只使用换行符(linefeed)来结束每一行,而DOS传统上使用CR+LF来结束每一行,Visual Studio应该完全在DOS世界中,但不管出于什么原因,当我们从代码服务器上获 ... 
- ESA2GJK1DH1K基础篇: 移植官方MQTT包,让TCP实现MQTT功能(以GPRS模块为例)
			前言 这节代码将在这一节的基础上实现 拷贝第一节测试里面的MQTT文件夹到当前工程 当前工程建个MQTT的文件夹,用于存放那个MQTT文件夹里面的内容 添加文件到里面 注意:::: 实际源码拷贝位置 ... 
- js中a + 1 < a等于true,(a ==1 && a== 2 && a==3) 等于 true如何实现
			先说a + 1 < a const a = { i: 1, valueOf: () => { if (a.i === 1) { return a.i++; } return a.i+2; ... 
- 在非gnome系桌面环境下运行deepin-wine tim的错误解决
			本文通过MetaWeblog自动发布,原文及更新链接:https://extendswind.top/posts/technical/deepin_wine_run_in_not_gnome_desk ... 
- Linux下的串口编程(转)
			https://blog.csdn.net/tigerjibo/article/details/6179291 #include<stdio.h> /*标准输入输出定义*/ #includ ... 
- vue父子(父传子)传值
			vue2.0中,实现父子组件间的传值,需要依靠一个props的属性,作为变量接收的对象. 注:vue.js文件引用的是本地的js文件,拷贝本机运行时,可以使用cnd替换. https://www.bo ... 
- 乘法器——基于Wallace树的4位乘法器实现
			博主最近在学习加法器乘法等等相关知识,在学习乘法器booth编码加Wallace树压缩时,发现在压缩部分积的时候用到了进位保留加法器(Carry Save Adder),博主对这种加法器不是很理解,而 ... 
- java版的状态机实现
			状态机适用场景: C的操作,需要等到A.B的两个操作(A.B顺序操作),那就需要在 A.B之间创建一个状态机(state machine),C的操作需要状态机达到某一个状态才能进行 1. Overvi ... 
- 配置两个不同kerberos认证中心的集群间的互信
			两个Hadoop集群开启Kerberos验证后,集群间不能够相互访问,需要实现Kerberos之间的互信,使用Hadoop集群A的客户端访问Hadoop集群B的服务(实质上是使用Kerberos Re ... 
- Jmeter websocket插件安装与使用
			Jmeter websocket插件安装与使用 Apache JMeter是Apache组织开发的基于Java的压力测试工具.用于对软件做压力测试,它最初被设计用于Web应用测试,但后来扩展到其他测试 ... 
 
			
		