日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

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

發布時間:2023/12/10 编程问答 28 豆豆
生活随笔 收集整理的這篇文章主要介紹了 $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

總結

以上是生活随笔為你收集整理的$Django importlib与dir知识,手写配置文件, 配置查找顺序 drf分页器drf版本控制的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。