1  importlib与dir知识

# importlib简介动态导入字符串模块
# 常规导入
from ss.aa import b
from ss import a
print(b,type(b))
#<module 'ss.aa.b' from 'F:\\python37\\pythonfiles\\ss\\aa\\b.py'> #<class 'module'># importlib动态导入py文件模块
import importlib
mod=importlib.import_module('ss.aa.b')
print(mod,type(mod))
#<module 'ss.aa.b' from 'F:\\python37\\pythonfiles\\ss\\aa\\b.py'> #<class 'module'>
print(dir(a))

2  手写配置文件

#默认配置setting包下的init.py内部
import os
from setting import settings   #settings.py 内部 AAA=NONE
class setting:def __init__(self):user_setting=os.environ.get('user_setting')for key in dir(settings):if key.isupper():setattr(self,key,getattr(settings,key))import importlibmod=importlib.import_module(user_setting)for key in dir(mod):if key.isupper():setattr(self,key,getattr(mod,key))
setting_obj=setting()#用户user_setting包下的setting.py 内部 AAA="aaa"#run.py执行文件
import os
os.environ.setdefault('user_setting','user_setting.user_setting')
from setting import setting_obj
print(setting_obj.AAA)

3 配置查找顺序

 1先找类里的 2再找setting里用户配置的 3最后找默认django.conf.setting内默认的

4  drf分页器

from paginnator import models
from rest_framework.viewsets import ViewSetMixin
from rest_framework.views import APIView
from paginnator import myserverlize
from rest_framework.pagination import PageNumberPagination,LimitOffsetPagination,CursorPagination
from rest_framework.response import Response
# 普通分页器  #当前页的数据 序列化 返回
class Book(ViewSetMixin,APIView): #半自动路由控制def list(self,request,*args,**kwargs):books=models.Book.objects.all()p=PageNumberPagination()#每页显示不超过p.max_page_size=10#每页默认显示几条p.page_size=2#第几页p.page_query_param='aaa'#第几页显示几条(修改默认显示)p.page_size_query_param = 'bbb'# 当前页对象p_now=p.paginate_queryset(books,request,view=self)# 序列化p_now_now=myserverlize.Myserializers(p_now,many=True)# 返回分页器自带的Response(上下页链接,总条数,当前页数据)# return p.get_paginated_response(data=p_now_now.data)#返回当前页数据return Response(p_now_now.data)def list_one(self,request,*args,**kwargs):#查看某条数据,1条数据pass# 偏移分页器
class Book(ViewSetMixin,APIView): #半自动路由控制def list(self,request,*args,**kwargs):books=models.Book.objects.all()p=LimitOffsetPagination()# 默认显示几条p.default_limit=3# 最大显示条数p.max_limit =10# p.limit_query_param = 'limit'# 偏移(?limit=13&offset=3) 从4算起显示10条# p.offset_query_param = 'offset'# 当前页数据p_now=p.paginate_queryset(books,request,view=self)p_now_now=myserverlize.Myserializers(p_now,many=True)return Response(p_now_now.data)def list_one(self,request,*args,**kwargs):#查看某条数据,1条数据pass
#加密分页器
#http://127.0.0.1:8000/book/?cursor=cD0xMg%3D%3D
class Book(ViewSetMixin,APIView): #半自动路由控制def list(self,request,*args,**kwargs):books=models.Book.objects.all()p=CursorPagination()p.ordering='id'p.page_size=4p.cursor_query_param = 'cursor'p_now=p.paginate_queryset(books,request,view=self)p_now_now=myserverlize.Myserializers(p_now,many=True)return p.get_paginated_response(p_now_now.data)def list_one(self,request,*args,**kwargs):#查看某条数据,1条数据pass

3种分页器

#第一种 ?page=4&page_size=100 每页显示100条
class PageNumberPagination(BasePagination):"""A simple page number based style that supports page numbers asquery parameters. For example:http://api.example.org/accounts/?page=4http://api.example.org/accounts/?page=4&page_size=100"""page_size = api_settings.PAGE_SIZE #?page=4 每页显示4条page_query_param = 'page' page_size_query_param = None  # ?page=4&page_size=100 每页显示100条max_page_size = None#第二种   ?offset=3&limit=13 从4算起显示13条
class LimitOffsetPagination(BasePagination):"""A limit/offset based style. For example:http://api.example.org/accounts/?limit=100http://api.example.org/accounts/?offset=400&limit=100"""default_limit = api_settings.PAGE_SIZElimit_query_param = 'limit'offset_query_param = 'offset'max_limit = None#第三种 ?cursor=cD0xMg%3D%3D
class CursorPagination(BasePagination):"""The cursor pagination implementation is necessarily complex.For an overview of the position/offset style we use, see this post:https://cra.mr/2011/03/08/building-cursors-for-the-disqus-api"""cursor_query_param = 'cursor'page_size = api_settings.PAGE_SIZEordering = '-created'page_size_query_param = Nonemax_page_size = None

#自带的获取当前页数据
def paginate_queryset(self, queryset, request, view=None):pass
#自带的返回 一个带上下链接 总统条数 当前数据def get_paginated_response(self, data):return Response(OrderedDict([('next', self.get_next_link()),('previous', self.get_previous_link()),('results', data)]))

5 drf版本控制

class BaseVersioning(object):default_version = api_settings.DEFAULT_VERSIONallowed_versions = api_settings.ALLOWED_VERSIONSversion_param = api_settings.VERSION_PARAM#
DEFAULTS={
# Versioning'DEFAULT_VERSION': None,'ALLOWED_VERSIONS': None,'VERSION_PARAM': 'version',
}

BaseVersioning部分源码

class URLPathVersioning(BaseVersioning):"""To the client this is the same style as `NamespaceVersioning`.The difference is in the backend - this implementation usesDjango's URL keyword arguments to determine the version.An example URL conf for two views that accept two different versions.urlpatterns = [url(r'^(?P<version>[v1|v2]+)/users/$', users_list, name='users-list'),url(r'^(?P<version>[v1|v2]+)/users/(?P<pk>[0-9]+)/$', users_detail, name='users-detail')]GET /1.0/something/ HTTP/1.1Host: example.comAccept: application/json"""def determine_version(self, request, *args, **kwargs):version = kwargs.get(self.version_param, self.default_version)if not self.is_allowed_version(version):raise exceptions.NotFound(self.invalid_version_message)return version

URLPathVersioning部分源码

class QueryParameterVersioning(BaseVersioning):"""GET /something/?version=0.1 HTTP/1.1Host: example.comAccept: application/json"""def determine_version(self, request, *args, **kwargs):version = request.query_params.get(self.version_param, self.default_version)if not self.is_allowed_version(version):raise exceptions.NotFound(self.invalid_version_message)return version

QueryParameterVersioning部分源码

    def initial(self, request, *args, **kwargs):"""Runs anything that needs to occur prior to calling the method handler."""# Determine the API version, if versioning is in use.version, scheme = self.determine_version(request, *args, **kwargs)request.version, request.versioning_scheme = version, scheme

dispacth

分析:1view对象 2从dispacth进入到版本类 3版本类在进入到基板类取到默认设置返回 得到

request.version, request.versioning_scheme = version, scheme #版本v1(默认version) ,版本类名(默认NONE)

使用

#URLPathVersioning(url)
url(r'(?P<version>[v1|v2|v3]+)/book/',views.Book.as_view({'get':'list'}) ),

#URLPathVersioning(view)class Book(ViewSetMixin,APIView): #半自动路由控制versioning_class=URLPathVersioningdef list(self,request,*args,**kwargs):books=models.Book.objects.all()p=CursorPagination()p.ordering='id'p.page_size=4p.cursor_query_param = 'cursor'p_now=p.paginate_queryset(books,request,view=self)p_now_now=myserverlize.Myserializers(p_now,many=True)return p.get_paginated_response(p_now_now.data)

#setting配置
REST_FRAMEWORK = {# 每页显示两条'PAGE_SIZE':10,# 'DEFAULT_VERSIONING_CLASS':'', #全局设置'VERSION_PARAM':'version','DEFAULT_VERSION':'v1','ALLOWED_VERSIONS': ['v1', 'v2'],
}

转载于:https://www.cnblogs.com/3sss-ss-s/p/10139128.html

最新文章

  1. Java 收集的代码 transient
  2. Unix高级环境编程—进程控制(一)
  3. Hibernate openSession() 和 getCurrentSession的区别 .
  4. SAP里面的ATP的定义
  5. jax-ws实现WebService
  6. nodejs 实现抓取数据
  7. 云计算设计模式(二)——断路器模式
  8. 多个相同参数表单提交
  9. 技校考大专单招计算机考试,高职单招题简单吗 单招一般考什么科目
  10. Activity的几种启动模式介绍
  11. 3dmax:3dmax动画栏(加载动画【IK计算器、约束、变换控制器、参数编辑器、关联参数、骨骼工具】、关键帧动画【修改关键帧、运动面板、曲线编辑器】、控制器动画【控制器指定】)之详细攻略
  12. HIMSS宣布 Healthcare IT News和MobiHealth News的国际扩张
  13. java生成iso9660工具_UltraISO 软碟通 (ISO编辑工具)
  14. 本机ip地址、本机DNS查询工具地址
  15. 从GDPR和个保法看,为什么要做数据合规?
  16. Linux基础知识学习
  17. div+css画六边形
  18. Hyperledger Fabric系统架构
  19. 关于用户故事地图的7种用法
  20. 如何去除图片背景颜色?怎样将背景色变透明?

热门文章

  1. 名词解释(容器、并发,插件,脚本)及程序对象的创建和注释文档
  2. Hammer.js移动端触屏框架的使用
  3. 列表异步线程加载图片
  4. mysql sql语句使用技巧
  5. 浅谈Java网络编程之Socket (1)
  6. http --- 缓存
  7. JavaScript --- 表单focus,blur,change事件的实现
  8. ZOJ4116 Game on a Graph
  9. 苹果Iphone/Ipad--L2T虚拟教程
  10. asp.net mvc4开启SqlServer 会话共享模式