导入drf_Django后端rest最简洁最快最全入门指南,1天学会DRF后端不夸张,看这篇就够了!!...
Django REST framework
模型
字段类型
#BooleanField
# CharField(max_length=none[, **options])
# DateField DateTimeField([auto_now=False, auto_now_add=False, **options]) ##自动更新 自动创建
# DecimalField(max_digits=None,decimal_places=None[, **options]) 小数点
# BinaryField
#ImageField([upload_to=None, height_field=None, width_field=None, max_length=100, **options]) 需要安装pillow模块
#EmailField([maxlength=75, **options])
#FileField(upload_to=None[, max_length=100, **options]) 默认的form widget 是 FileInput
#FloatField
#IntegerField #整数
#IPAddressField
#GenericIPAddressField
#NullBooleanField
#PositiveIntegerField 正证书
#SlugField url常用 只能包含字母,数字,下划线和连字符的字符串
#TextField 大文本
#TimeField
#URLField
#FilePathField(path=None[, match=None, recursive=False, max_length=100, options])
## ProcessedImageField 使用imagekit模块
模型filed选项
#editable #error_messages #help_text
#primary_key radio_admin unique
#unique_for_date #unique_for_month
#unique_for_year
#validators
#db_index=True 创建索引
#verbose_name string类型。更人性化的列名。
## 获取drf模板源码交流学习 联系作者wechat yihongwxh
序列器
决定输入输出结构
常规示例写法
id = serializers.IntegerField(label='ID', read_only=True)
一般验证
使用模型序列器,extra_kwargs 来给字段加验证
class TaskSerializer(serializers.ModelSerializer):class Meta:model = Task#read_only_fields = ( 'date',)# fields = '__all__' 输出所有模型# exclude = ('image',) 排除模型fields = ('q','a',"link","myfile","choice","myimg")extra_kwargs = {#额外参数 指定最大最小值'q': { 'required': True,'label':u"问题"}, #可使用的额外参数 label='阅读量', max_value=2147483647, min_value=0, required=True'a': { 'required': True,'max_length':5,'help_text': u'帮助介绍'}, #read_only=True max_length=20}
## 获取drf模板源码交流学习 联系作者wechat yihongwxh
单独某个字段验证
def validate_q(self, attrs): ##validate+字段名进行序列验证if 's' not in attrs:raise serializers.ValidationError(u'必须包含s')return attrs
多字段验证
def validate(self, attrs): # 给多个字段增加校验bread = attrs['bread']bcomment = attrs['bcomment']if bread < bcomment:raise serializers.ValidationError('阅读量小于评论量')return attrs
常规序列器与模型序列器
自动生成字段 validators 包含create()和update()方法
视图
默认视图APIVIEW
class BookView(APIView): ##需要自定义get,post,patch,delete方法
def get(self, request):query_set = Book.objects.all()book_ser = BookSerializer(query_set, many=True)return Response(book_ser.data)
def post(self, request):query_set = request.databook_ser = BookSerializer(data=query_set)if book_ser.is_valid():book_ser.save()return Response(book_ser.validated_data)else:return Response(book_ser.errors)
## 获取drf模板源码交流学习 联系作者wechat yihongwxh
封装过的GenericAPIView
# 默认使用queryset serializer_class
# 包含5个mixin 封装了get,post,patch,delete方法 对应ListModelMixin, CreateModelMixin,GenericAPIView, RetrieveModelMixin, UpdateModelMixin, DestroyModelMixin
# 5个mixin封装成2个apiview ListCreateAPIView RetrieveUpdateDestroyAPIView
使用viewsetmixin带action路由传参封装成modelviewset
class BookView(ModelViewSet):queryset = Book.objects.all()serializer_class = BookSerializer
使用action进行自定义路由
@action(methods=['get','post'],detail=False) ##自定义方法
# action是drf提供的路由和视图方法绑定关系的装饰器
# 参数2: detail 当前是否方法是否属于详情页视图,False,系统不会自动增加pk在生成的路由地址中 True 则系统会自动增加pk在生成的路由地址
def query(self,request): # 其接口 http://127.0.0.1:8000/task/query/# 获取阅读量最多的5条数据para= request.query_params ## request.data post put 参数books = Task.objects.filter(q__contains =para['q']) # 多条查询使用Q #table.object.filter(Q(title__startswith='key1') | Q(title__startswith='key2'))serializer = TaskSerializer(instance=books,many=True)return Response(serializer.data)
queryset查询语句
##filter内容
# Blog.objects.filter(title__contains ="django")
#.objects.filter(id__in = [3,6,9])
#.objects.filter(id__range =(30,45))
#.objects.exclude(id=3)
#.objects.filter(create_time__year = 2018)
#objects.filter(create_time__month=3)
#.objects.dates('create_time', 'year','DESC') 返回时间
##__gt gte lt lte startswith endswith
获取请求数据
#request.query_params 存放的是我们get请求的参数
#request.data 存放的是我们所有的数据,包括post请求的以及put,patch请求
##默认django方法request.POST.get() request.GET.get("pid")
##请求方法判断 request.method
响应
# Response(content, status=status.HTTP_404_NOT_FOUND)
# 状态码的种类....
自定义排序搜索过滤器
class TaskView(ModelViewSet):filter_class = MyFilterordering_fields = ('q', 'choice') ##?ordering=price,name 查询 按照 price 排序后 在按 name 排序的结果 支持升序和降序 加-号即可search_fields = ('q', 'a', 'link') # 模糊搜索 加入对应字段即可
##需要在全局setting.py导入
INSTALLED_APPS = ['django_filters',
]
##排序搜索器导入setting.py 全局配置
REST_FRAMEWORK = {'DEFAULT_PAGINATION_CLASS': 'rest_framework.pagination.LimitOffsetPagination','PAGE_SIZE': 20,'DEFAULT_FILTER_BACKENDS':['rest_framework.filters.OrderingFilter','django_filters.rest_framework.DjangoFilterBackend','rest_framework.filters.SearchFilter'],
}
路由
一般APIview写法
urlpatterns = [url(r'^book$', BookView.as_view({"get": "list", "post": "create"})),url(r'^book/(?P<pk>d+)$', BookView.as_view({"get": "retrieve", "patch": "update", "delete": "destroy"})),
]
###默认使用参数pk传递 指定get patch update delete 对应函数名
modelviewset路由自动注册
router = DefaultRouter()
router.register(r"book", BookView)
##自动注册5个方法,
权限设置RBAC
修改全局设置
##修改全局setting
AUTHENTICATION_BACKENDS = ['account.backend.Mybackend','django.contrib.auth.backends.ModelBackend',
]
AUTH_USER_MODEL = 'account.MyUser'
注册admin跟user role permission模型
#admin.py 注册
admin.site.register(MyUser, UserAdmin)
#backend.py 示例
class Mybackend(ModelBackend):def authenticate(self, username=None, password=None):if username and password:user = get_user_model().objects.filter(username=username).first()if user and user.check_password(password):return user
##创建3个模型 user role permission 分别嵌套
roles = models.ManyToManyField("Role", verbose_name="角色", blank=True)
服务端token生成
##登录验证返回token
##登录视图
class LoginView(APIView):serializer_class = LoginSerializerdef post(self, request):serializer = LoginSerializer(data=request.data)serializer.is_valid(raise_exception=True)user = serializer.validated_data['user']token, created = Token.objects.get_or_create(user=user)return Response({'token': token.key})
#登录序列器
class LoginSerializer(serializers.Serializer):username = serializers.CharField(required=True, error_messages={'blank': u'用户名不能为空'})password = serializers.CharField(style={'input_type': 'password'}, required=True, error_messages={'blank': u'密码不能为空'})def validate(self, attrs):username, password= attrs['username'], attrs['password']user = authenticate(username=username, password=password)if not user:raise ValidationError(u'用户名或者密码错误')attrs['user'] = userreturn attrs
## 获取drf模板源码交流学习 联系作者wechat yihongwxh
前端传token
## header中传入 Authorization: Token 5e8341bfc3bda41f169ef6ee15613bca47619a44
封装的permission检查方法
perms_map = (('*', '*', '会员'), ('list', '*', '普通用户'), ##*表示能没有权限限制('create', 'VIP', '会员'), ('update', 'VIP', '会员'),('destroy', 'VIP','会员'),('query', "*", "查询"),)
### 传入perms_map list create update distory 以及自定义方法对应的权限方法 作为第二个参数传入
permission_classes = [RbacPermission, ]
一般权限
class RbacPermission(BasePermission): ##一般权限def get_current_method(self, request, view):"""获取当前请求的方法(当前请求的是post/get 还是 viewset 的 action):param request::param view::return:"""return hasattr(view, 'action') and getattr(view,'action') or request._request.method.lower()@classmethod ##不需要实例化直接调用def get_permission_from_role(cls, request):try:perms = request.user.roles.values('permissions__name', ).distinct() ##后面的权限方法都写在method中return [p['permissions__name'] for p in perms] ##写入到权限方法中去except AttributeError:return []def get_current_perms(self, request, view):"""获取当前需要验证的权限:return:"""_method = self.get_current_method(request, view)perms_map = view.perms_map# name_or_perm_obj 可能是权限名称,也可能是基于BasePermission的权限扩展实例try:action, name_or_perm_obj, label = [(action, name_or_perm_obj, label)for action, name_or_perm_obj, label in perms_mapif action == _method][0]except IndexError:return Trueprint name_or_perm_objreturn name_or_perm_objdef has_permission(self, request, view):if request.user.is_superuser:return True
if not hasattr(view, 'perms_map'): ##搜集所需权限列表return Truename_or_perm_obj = self.get_current_perms(request, view)if isinstance(name_or_perm_obj, BasePermission):return name_or_perm_obj.has_permission(request, view) ##权限对象检查return self.has_name_in_perms(name_or_perm_obj, request) ##字段检查def has_name_in_perms(self, perm_name, request): ##检查用户有没有这个权限perms = self.get_permission_from_role(request)return perm_name == '*' or perm_name in perms
对象权限
class ObjPermission(BasePermission): ###通过用户id来检查def has_object_permission(self, request, view, obj):if request.user.is_superuser:return Trueelif request.user.id == obj.uid_id:return True
全局配置选项
MEDIA_URL = '/media/' ##媒体文件上传路径
MEDIA_ROOT = os.path.join(BASE_DIR, 'media')
LANGUAGE_CODE = 'zh-hans' #语言
文档写作
class TaskView(ModelViewSet):''' ##markdown 使用说明'''
@swagger_auto_schema(method='get',operation_description='查询单个详细参数')
## swagger路由配置及后端登录接口url(r'^swagger(?P<format>.json|.yaml)$', schema_view.without_ui(cache_timeout=0),name='schema-json'),url(r'^swagger/$', schema_view.with_ui('swagger', cache_timeout=0), name='schema-swagger-ui'),url(r'^redoc/$', schema_view.with_ui('redoc', cache_timeout=0), name='schema-redoc'),url(r'^api/', include('rest_framework.urls', namespace='rest_framework_docs')),
插件
drf-ysag
django_filters
imagekit
常用导入头
# -*- coding: utf-8 -*-
from __future__ import unicode_literals
##视图类
from rest_framework.views import APIView
from rest_framework.generics import GenericAPIView,ListCreateAPIView,RetrieveUpdateDestroyAPIView
from rest_framework.mixins import ListModelMixin, CreateModelMixin,RetrieveModelMixin, UpdateModelMixin, DestroyModelMixin
from rest_framework.viewsets import ViewSetMixin
from rest_framework.viewsets import ModelViewSet
import django_filters ##过滤器
from rest_framework.decorators import action
from rest_framework import routers, serializers
from rest_framework.response import Response ##响应
from django.conf import settings
from rest_framework import routers, serializers, viewsets
from django.contrib.auth import authenticate ##认证
from rest_framework.authtoken.models import Token ##token导入
from rest_framework.exceptions import ValidationError ##序列化出错返回
##路由
from django.conf.urls import url, include
from rest_framework.routers import DefaultRouter
导入drf_Django后端rest最简洁最快最全入门指南,1天学会DRF后端不夸张,看这篇就够了!!...相关推荐
- 【直达本质】超快 STM32 系统入门指南
计算机类的教程多,框架和 API 用法讲的全面,成系统的教程很多,CSDN上.知乎上很多个人学习记录和全面的成书的教程,而且生动形象有甚至有动画讲解,回过头来看嵌入式的教程,又臭又长.本文 Githu ...
- vhdl语言入门_初学Chisel语言,看这篇就够了:最方便简洁的入门资料整理
声明:本文是我一个很优秀的学生总结的,放出来供广大chisel语言爱好者参考. Chisel(Constructing Hardware In a Scala Embedded Language)是U ...
- 对标小程序 ? 快应用开发入门指南
本文已在我的公众号:hongyangAndroid原创首发: 一.快应用的出现 3月20日,中国通信院等协会联合包括小米.华为.OPPO等手机厂商,共同在北京正式发布名为「快应用」的新型应用形态协议. ...
- rsa前后端加密流程_不懂前后端分离?这篇就够了
一 传统的开发模式 前后端分离前我们的开发协作模式一般是这样的: 前端写好静态的HTML页面交付给后端开发.静态页面可以本地开发,也无需考虑业务逻辑只需要实现View即可. 后端使用模板引擎去套模板, ...
- 从壹开始前后端分离 [ Vue2.0+.NET Core2.1] 十四 ║ VUE 计划书 我的前后端开发简史...
---新内容开始--- 番外 大家周一好呀,又是元气满满的一个周一呀!感谢大家在周一这个着急改Bug的黄金时期,抽出时间来看我的博文哈哈哈,时间真快,已经到第十四篇博文了,也很顺顺(跌跌)利利 (撞撞 ...
- python十分钟教程_简洁的十分钟Python入门教程
[简介] Python是一种动态解释型的编程语言.Python可以在Windows.UNIX.MAC等多种操作系统上使用,也可以在Java..NET开发平台上使用. [特点] 1 Python使用C语 ...
- 前后端分离的项目部署到tomcat_如何在开发时部署和运行前后端分离的JavaWeb项目...
在开发中大型的JavaEE项目时,前后端分离的框架逐渐成为业界的主流,传统的单机部署前后端在同一个项目中的工程项目越来越少.这类JavaWeb项目的后端通常都采用微服务的架构,后端会被分解为诸多个小项 ...
- 如何选购USB充电器?什么是PD?什么是QC?多埠的比较好吗?什么是快充?【看这一篇就够了】
你真的明白什么是快充吗? 目录 你真的明白什么是快充吗? 多孔充电埠 输出能力 单埠限流 选购要诀 V(电压)A(电流) W(功率)关系&换算 总输出能力.能效与单埠限流 V(电压) x A( ...
- 写给刚入门的前端工程师的前后端交互指南
转自原文 写给刚入门的前端工程师的前后端交互指南 作为刚接触前端的不久的童鞋,大家都会兴奋于CSS和JS所带来漂亮界面,然而,前端工程师除了UI重构外,还有非常重要的职责在正确的区域渲染出服务端的数据 ...
最新文章
- 使用Pyhthon,OpenCV和ZBar构建移动的条码扫描器
- Opengl-基本概念-对象(很关键啊兄弟这章)
- ML之xgboost:利用xgboost算法(sklearn+3Split+调参曲线)训练mushroom蘑菇数据集(22+1,6513+1611)来预测蘑菇是否毒性(二分类预测)
- 乡村要振兴,快递先进村?
- Codeforces 1025G Company Acquisitions (概率期望)
- 技术实践 | 网易云信在融合通信场景下的探索和实践之 RTMPGateway 服务架构
- 10大清宿便排毒方法及简单排毒瘦小腹运动
- 关于deepearth的一点小问题
- python多个对象调用类方法、且之间有联系_趣味解读Python面向对象编程 (类和对象)...
- iVMS-4200 Vs区别_杏林早报 | 西芹、水芹、旱芹...功效有区别,吃对才真降血压!...
- 使用c++制作微服务计算服务
- git clone 拉取github上面的代码报错:fatal: Authentication failed for xxx解决
- caffe自带可运行的两个例子:mnist和cifar10
- 单元格自适应宽度_Excel – 合并单元格时,如何同时保留每个单元格的内容?...
- python怎么下载网易云歌曲_python 下载网易云歌曲(能在线听都可以)
- 菲仕乐高压锅型号全面详解
- 龙之谷服务器列表不显示,龙之谷服务器列表,龙之谷服务器列表弹不出来
- 教你如何搜索百度网盘的资源 百度网盘资源搜索方法!
- Unity 引擎开始从 Mono 迁移到 .NET CoreCLR
- navicat 快捷键使用
热门文章
- Shamir密钥分享算法 python实现
- python绘图库seaborn_python绘图库——Matplotlib及Seaborn使用(入门篇2)
- php怎么像git那样做diff,Git 基本操作
- Netty实现的一个异步Socket代码
- Hibernate 一对一关联查询
- Android studio每次启动卡在fetching Android sdk compoment information的解决方案
- BAPI:BAPI_PRODORDCONF_CREATE_TT (TCODE:CO11N)
- android x866.0 教程,海尔暴风AmlogicT866平台升级步骤教程
- mysql 请求超时_由请求超时引发的mysql慢日志问题
- 传递function_Excel VBA解读(132): 调用Function过程的4种方式