$Django importlib与dir知识,手写配置文件, 配置查找顺序 drf分页器drf版本控制

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/265167.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

springMVC_07乱码及restful风格

乱码的解决 通过过滤器解决乱码问题:CharacterEncodingFilter 配置web.xml文件 <filter><filter-name>encoding</filter-name><filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class><init-param><para…

[转】HTTP请求流程(二)----Telnet模拟HTTP请求

转自&#xff1a; http://www.cnblogs.com/stg609/archive/2008/07/06/1237000.html 上一部分"流程简介"&#xff0c; 我们大致了解了下HTTP请求的流程&#xff0c;这一篇我向大家介绍下如何利用Telnet来模拟Http请求---访问百度。 我们直接开始吧&#xff01; …

设备树下的LED驱动实验

目录设备树LED驱动原理硬件原理图分析实验程序编写修改设备树文件(根节点下添加好区分)LED灯驱动程序编写编写测试APP运行测试编译驱动程序和测试APP运行测试上一章我们详细的讲解了设备树语法以及在驱动开发中常用的OF 函数&#xff0c;本章我们就开始第一个基于设备树的Linux…

《现代操作系统》精读与思考笔记 第七章 多媒体

第七章部分内容与前几章内容关联很大&#xff0c;比如进程调度、磁盘调度、文件系统&#xff0c;而且多为实现细节&#xff0c;这里不详述。 1.帧数与闪烁&#xff08;P476&#xff09; 画面动作的平滑性不是完全由每秒的帧数决定的&#xff0c;而是由每秒不同画面的数目决定的…

pinctrl和gpio子系统实验(芯片原厂做的,类似STM32的HAL库,我们只需调用API来直接操作GPIO)

目录pinctrl子系统pinctrl子系统简介(半导体厂商写的)I.MX6ULL的pinctrl子系统驱动分析0、通过compatbile属性查找对应驱动文件1、PIN配置信息详解(获取寄存器地址)2、PIN 驱动程序流程讲解(流程图&#xff0c;了解)设备树中添加pinctrl节点模板(半导体厂商瑞芯微、海思厂商写的…

成为你自己

2019独角兽企业重金招聘Python工程师标准>>> 一个看过许多国家、民族以及世界许多地方的旅行家&#xff0c;若有人问他&#xff0c;他在各处发现人们具有什么相同的特征&#xff0c;他或许会回答∶他们有懒惰的倾向。有些人会觉得&#xff0c;如 果他说他们全是怯懦…

网络知识梳理--OSI七层网络与TCP/IP五层网络架构及二层/三层网络

作为一个合格的运维人员&#xff0c;一定要熟悉掌握OSI七层网络和TCP/IP五层网络结构知识。 废话不多说&#xff01;下面就逐一展开对这两个网络架构知识的说明&#xff1a;一、OSI七层网络协议OSI是Open System Interconnect的缩写&#xff0c;意为开放式系统互联。 OSI参考模…

Linux蜂鸣器实验(使用上一节子系统思想,摈弃了自己配置寄存器的繁琐操作)

目录子系统思想的蜂鸣器驱动流程硬件原理图分析实验程序编写修改设备树文件蜂鸣器驱动程序编写编写测试APP运行测试编译驱动程序和测试APP运行测试上一章实验中我们借助pinctrl 和gpio 子系统编写了LED 灯驱动&#xff0c;I.MX6U-ALPHA 开发板上还有一个蜂鸣器&#xff0c;从软…

gitbash如何修改可恶的蓝色字体

1、问题 这完全看不清啊&#xff01;&#xff01; 2、环境 git version 2.19.0 3、解决 1&#xff09;编辑/etc/bash.bashrc # Uncomment to use the terminal colours set in DIR_COLORS eval "$(dircolors -b /etc/DIR_COLORS)" 2&#xff09;编辑/etc/DIR…

Oracle分析函数

2019独角兽企业重金招聘Python工程师标准>>> Oracle分析函数——函数列表 SUM &#xff1a;该函数计算组中表达式的累积和 MIN &#xff1a;在一个组中的数据窗口中查找表达式的最小值 MAX &#xff1a;在一个组中的数据窗口中查找表达式的…

Linux并发与竞争介绍(原子操作、自旋锁、信号量、互斥体)

目录并发与竞争并发与竞争简介保护内容是什么原子操作原子操作简介原子整形操作API函数(atomic_t 结构体)原子位操作API 函数自旋锁自旋锁简介自旋锁API函数线程与线程线程与中断(获取锁之前关闭中断)其他类型的锁(读写锁、顺序锁)自旋锁使用注意事项信号量信号量简介信号量API…

新后缀再开放,投资者应谨慎对待!

为什么80%的码农都做不了架构师&#xff1f;>>> 新后缀再开放&#xff0c;投资者应谨慎对待&#xff01;2014年伊始&#xff0c;一大批如BIKE&#xff0c;GURU&#xff0c;HOLDINGS等新域名后缀正式启用&#xff0c;是继CNNIC开放CN保留域名注册之后&#xff0c;投…

Linux并发与竞争实验(一次只允许一个应用程序操作LED灯)

目录原子操作实验实验程序编写运行测试(运行多个APP抢占资源)自旋锁实验实验程序编写运行测试信号量实验实验程序编写运行测试(第二条命令因为获取信号量失败而进入休眠状态)互斥体实验(类似二值信号量&#xff0c;会休眠)实验程序编写运行测试在上一章中我们学习了Linux 下的并…

在 SharePoint 2013 中选择正确的 API 集

决定使用哪个 API 集的因素 您可以在多个 API 集中选择一个来访问 SharePoint 2013 平台。您使用哪一个 API 集取决于以下因素&#xff1a; 应用程序的类型。 可能的类型包括但不限于以下不相互排斥的类别&#xff1a;SharePoint 相关应用程序、SharePoint 页上的 Web 部件、在…

Linux按键输入实验(体验一下输入驱动,实际开发使用input子系统处理)

目录Linux下按键驱动原理(使用原子操作)硬件原理图分析实验程序编写修改设备树文件按键驱动程序编写编写测试APP(循环读取按键值)运行测试编译驱动程序和测试APP运行测试(while循环导致CPU占用率很高&#xff0c;后面使用阻塞非阻塞IO处理)在前几章我们都是使用的GPIO 输出功能…

SAP Fiori + Vue = ?

2017年3月28日&#xff0c;我到国内一个SAP CRM客户那里&#xff0c;同他们的架构师关于二次开发的UI框架选择SAP UI5还是Vue进行了一番探讨。回到SAP研究院之后&#xff0c;我把这个问题扔到了公司的微信群里&#xff0c;引起了大家的热烈讨论。 因为出差回来之后&#xff0c;…

Linux 内核定时器实验————复习到这

目录Linux 时间管理和内核定时器简介内核时间管理简介内核定时器简介Linux 内核短延时函数硬件原理图分析实验程序编写修改设备树文件定时器驱动程序编写编写测试APP运行测试编译驱动程序和测试APP运行测试定时器是我们最常用到的功能&#xff0c;一般用来完成定时功能&#xf…

商品评价判别,文本分类——学习笔记

FASTTEXT&#xff08;Facebook开源技术&#xff09; 二分类任务&#xff0c;监督学习。 自然语言 NLP自然语言处理 步骤&#xff1a; 语料Corpus&#xff1a;好评和差评分词Words Segmentation&#xff1a;基于HMM构建dict tree 构建词向量Construct Vector&#xff1a; one-ho…

跨平台(Android, iOS, WP, HTML5)游戏开发libGDX学习教程

2019独角兽企业重金招聘Python工程师标准>>> 疯狂小土豆的跨平台游戏开发引擎libGDX游戏开发视频&#xff0c;本视频主讲Android和桌面游戏开发。libGdx是一个跨平台的2D/3D的游戏开发框 架&#xff0c;它由Java/C/C语言编写而成。它基于Apache License, Version 2.…

Linux 中断实验

目录Linux 中断简介Linux 中断API 函数上半部与下半部设备树中断信息节点获取中断号硬件原理图分析实验程序编写修改设备树文件按键中断驱动程序编写编写测试APP运行测试编译驱动程序和测试APP运行测试不管是裸机实验还是Linux 下的驱动实验&#xff0c;中断都是频繁使用的功能…