$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 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 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=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%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_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<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.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<version>[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'],
}
随机推荐
- Quartus II 中 Verilog 常见警告/错误汇总
Verilog 常见错误汇总 1.Found clock-sensitive change during active clock edge at time <time> on regis ...
- SQLyog远程连接腾讯云服务器数据库Mysql遇到的坑
首先说明我的数据库是安装在云服务器上,不是专业的数据库服务器,没错就是10块钱包月的. 然后觉得使用SQLyog远程维护数据库比较方面,可是怎么都登录不上去. 下面分析原因: 1.安全组是否放过了访问 ...
- bzoj千题计划312:bzoj2119: 股市的预测(后缀数组+st表)
https://www.lydsy.com/JudgeOnline/problem.php?id=2119 题意:将给定数组差分后,求ABA形式的字串个数,要求|B|=m,|A|>0 1.后缀数 ...
- SQL Server2012安装流程
今天手比较抽风,把原来的SQL Server给卸载了,卸载还卸了半天,真是…… 安装时找了好多教程,结果都不是很详细,然后准备自己摸索一下,把这个过程记录下来,供大家参考,如果有不当的地方,欢迎指正, ...
- 【移动端】300ms延迟以及点透事件原因以及解决方案
产生原因 移动端会有双击缩放的这个操作,因此浏览器在click之后要等待300ms,看用户有没有下一次点击,也就是这次操作是不是双击 说完移动端点击300ms延迟的问题,还不得不提一下移动端点击穿透的 ...
- Javaweb学习笔记——(二十)——————Javaweb监听器、国际化
Javaweb监听器 三大组件 *Servlet *Listener *Filter Listener:监听器 1.初次相见:A ...
- Spring 快速开始 启动Spring
[启动Spring必须配置] [web.xml部署描述符方式] 1.配置Servlet级别上下文 <servlet> <servlet-name>springDispatche ...
- ue4 笔记
关卡场景内的模型在运行中,改变构建脚本后无法立即更新模型骨骼中心点碰到物理边缘 physcX会出问题 bug 纹理启用碰撞会与碰撞顶点冲突 造成效果不正确 IsInGameThread() 渲染时 会 ...
- js伪数组转数组
方法1: 遍历伪数组,在把值push进一个空数组中 方法2: 使用数组的slice方法,它返回的是数组,使用call或apply指向伪数组 var arr = [].slice.call(argume ...
- 在webpack中区分环境变量
webpack 中的定义插件可以帮我们定义一些全局变量,使用方法如下: plugins: [ new webpack.DefinePlugin({ NODE_ENV: JSON.stringify(' ...