博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
$Django importlib与dir知识,手写配置文件, 配置查找顺序 drf分页器&drf版本控制
阅读量:4308 次
发布时间:2019-06-06

本文共 7886 字,大约阅读时间需要 26 分钟。

1  importlib与dir知识

# importlib简介动态导入字符串模块# 常规导入from ss.aa import bfrom ss import aprint(b,type(b))#
#
# importlib动态导入py文件模块import importlibmod=importlib.import_module('ss.aa.b')print(mod,type(mod))#
#
print(dir(a))

2  手写配置文件

#默认配置setting包下的init.py内部import osfrom setting import settings   #settings.py 内部 AAA=NONEclass 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 importlib        mod=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 osos.environ.setdefault('user_setting','user_setting.user_setting')from setting import setting_objprint(setting_obj.AAA)

3 配置查找顺序

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

4  drf分页器

from paginnator import modelsfrom rest_framework.viewsets import ViewSetMixinfrom rest_framework.views import APIViewfrom paginnator import myserverlizefrom rest_framework.pagination import PageNumberPagination,LimitOffsetPagination,CursorPaginationfrom 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%3Dclass Book(ViewSetMixin,APIView): #半自动路由控制    def list(self,request,*args,**kwargs):        books=models.Book.objects.all()        p=CursorPagination()        p.ordering='id'        p.page_size=4        p.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 as    query parameters. For example:    http://api.example.org/accounts/?page=4    http://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=100    http://api.example.org/accounts/?offset=400&limit=100    """    default_limit = api_settings.PAGE_SIZE    limit_query_param = 'limit'    offset_query_param = 'offset'    max_limit = None#第三种 ?cursor=cD0xMg%3D%3Dclass 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_SIZE    ordering = '-created'    page_size_query_param = None    max_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_VERSION    allowed_versions = api_settings.ALLOWED_VERSIONS    version_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 uses    Django's URL keyword arguments to determine the version.    An example URL conf for two views that accept two different versions.    urlpatterns = [        url(r'^(?P
[v1|v2]+)/users/$', users_list, name='users-list'), url(r'^(?P
[v1|v2]+)/users/(?P
[0-9]+)/$', users_detail, name='users-detail') ] GET /1.0/something/ HTTP/1.1 Host: example.com Accept: 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.1    Host: example.com    Accept: 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
[v1|v2|v3]+)/book/',views.Book.as_view({
'get':'list'}) ),
#URLPathVersioning(view)class Book(ViewSetMixin,APIView): #半自动路由控制    versioning_class=URLPathVersioning    def list(self,request,*args,**kwargs):        books=models.Book.objects.all()        p=CursorPagination()        p.ordering='id'        p.page_size=4        p.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

你可能感兴趣的文章
Pull Request流程
查看>>
Lambda 表达式
查看>>
函数式数据处理(一)--流
查看>>
java 流使用
查看>>
java 用流收集数据
查看>>
java并行流
查看>>
CompletableFuture 组合式异步编程
查看>>
mysql查询某一个字段是否包含中文字符
查看>>
Java中equals和==的区别
查看>>
JVM内存管理及GC机制
查看>>
Java:按值传递还是按引用传递详细解说
查看>>
Java中Synchronized的用法
查看>>
阻塞队列
查看>>
linux的基础知识
查看>>
接口技术原理
查看>>
五大串口的基本原理
查看>>
PCB设计技巧与注意事项
查看>>
linux进程之间通讯常用信号
查看>>
main函数带参数
查看>>
PCB布线技巧
查看>>