应用办公生活信息教育商业
投稿投诉
商业财经
汽车智能
教育国际
房产环球
信息数码
热点科技
生活手机
晨报新闻
办公软件
科学动态
应用生物
体育时事

从0到1开发自动化运维平台接口文档分页视图和权限配置

  安装依赖pipinstalldjangorestframeworksimplejwtpipinstalldjangofilterpipinstallcoreapipipinstalldrfyasg配置swagger接口文档
  1、添加drfyasg到settings。pyINSTALLEDAPPS〔。。。restframework,drfyasg,cmdb。apps。CmdbConfig,〕
  2、配置路由fromrestframeworkimportpermissionsfromdrfyasg。viewsimportgetschemaviewfromdrfyasgimportopenapischemaviewgetschemaview(openapi。Info(titleDevOps运维平台,defaultversionv1,descriptionDevOps运维平台接口文档,termsofservice,contactopenapi。Contact(emailqqinglaihotmail。com),licenseopenapi。License(nameBSDLicense),),publicTrue,permissionclasses(permissions。AllowAny,),)。。。urlpatterns〔path(apidoc,schemaview。withui(swagger,。。。〕restframework配置drf配置RESTFRAMEWORK{自定义分页DEFAULTPAGINATIONCLASS:common。extends。pagination。CustomPagination,PAGESIZE:20,用户登陆认证方式DEFAULTAUTHENTICATIONCLASSES:(restframeworksimplejwt。authentication。JWTAuthentication,restframework。authentication。SessionAuthentication,restframework。authentication。BasicAuthentication,),全局权限拦截DEFAULTPERMISSIONCLASSES:(common。extends。permissions。RbacPermission,),DEFAULTSCHEMACLASS:restframework。schemas。coreapi。AutoSchema,DEFAULTFILTERBACKENDS:(djangofilters。restframework。DjangoFilterBackend,restframework。filters。SearchFilter,restframework。filters。OrderingFilter,),DEFAULTRENDERERCLASSES:〔restframework。renderers。JSONRenderer,restframework。renderers。BrowsableAPIRenderer〕ifDEBUGelse〔restframework。rend分页扩展!usrbinenvpythonencoding:utf8author:CharlesLaifile:pagination。pytime:2023032615:22contact:qqinglaihotmail。comhereputtheimportlibfromrestframework。paginationimportPageNumberPagination,LimitOffsetPaginationfromrestframework。responseimportResponsefromrestframeworkimportstatusclassCustomPagination(PageNumberPagination):defgetpaginatedresponse(self,data):returnResponse({data:{list:data,total:self。page。paginator。count,next:self。getnextlink(),previous:self。getpreviouslink()},success:True,errorCode:0,errorMessage:None},statusstatus。HTTP200OK)自定义公共视图!usrbinenvpythonencoding:utf8author:CharlesLaifile:viewsets。pytime:2023032614:42contact:qqinglaihotmail。comhereputtheimportlibimportinspectfromrestframework。permissionsimportIsAuthenticatedfromrestframework。responseimportResponsefromrestframeworkimportstatusfromrestframeworkimportviewsetsfromrestframeworkimportpaginationfromrestframework。settingsimportapisettingsfromrestframework。filtersimportOrderingFilterfromdjango。db。models。queryimportQuerySetfromdjango。db。modelsimportProtectedErrorfromdjango。core。cacheimportcacheimportpytzimportloggingloggerlogging。getLogger(name)defopsresponse(data,successTrue,errorCode0,errorMessageNone,statusstatus。HTTP200OK):返回自定义data列表数据格式:{list:〔〕,current?:number,pageSize?:number,total?:number,}returnResponse({data:data,success:success,errorCode:errorCode,errorMessage:errorMessage},statusstatus)classAutoModelViewSet(viewsets。ModelViewSet):Aviewsetthatprovidesdefaultcreate(),retrieve(),update(),partialupdate(),destroy()andlist()actions。permissionclasses〔IsAuthenticated〕permissionclassesbyaction{}filterbackends(OrderingFilter,)definit(self,args,kwargs):ifnothasattr(self,queryset):raiseAttributeError(必须定义类属性queryset)ifnothasattr(self,serializerclass):raiseAttributeError(必须定义类属性serializerclass)super()。init(args,kwargs)defgetserializer(self,args,kwargs):重写getserializer类,用来支持自动获取不同的serializerclass例子:list方法,设置一个serializerlistclass,则调用getserializer的时候,优先获取命名格式serializer{callfuncname}class:paramargs::paramkwargs::return:callfuncnameinspect。stack()〔1〕〔3〕serializerclassgetattr(self,fserializer{callfuncname}class,None)ifnotserializerclass:serializerclassself。getserializerclass()kwargs〔context〕self。getserializercontext()returnserializerclass(args,kwargs)defgetobject(self):returnsuper(AutoModelViewSet,self)。getobject()defgetpermissions(self):try:return〔permission()forpermissioninself。permissionclassesbyaction〔self。action〕〕exceptKeyError:return〔permission()forpermissioninself。permissionclasses〕defgetpermissionfromrole(self,request):try:permsrequest。user。roles。values(permissionsmethod,)。distinct()return〔p〔permissionsmethod〕forpinperms〕except(AttributeError,TypeError):return〔〕defextendfilter(self,queryset):returnquerysetdefgetqueryset(self):assertself。querysetisnotNone,(sshouldeitherincludeaquerysetattribute,oroverridethegetqueryset()method。self。class。name)querysetself。extendfilter(self。queryset)ifisinstance(queryset,QuerySet):querysetqueryset。all()returnqueryset。distinct()defcreate(self,request,args,kwargs):try:request。data〔name〕request。data〔name〕。strip()。replace(,)exceptBaseExceptionase:logger。debug(exception,str(e))serializerself。getserializer(datarequest。data)ifnotserializer。isvalid():returnopsresponse({},successFalse,errorCode40000,errorMessageserializer。errors)try:self。performcreate(serializer)exceptBaseExceptionase:returnopsresponse({},successFalse,errorCode50000,errorMessagestr(e),statusstatus。HTTP500INTERNALSERVERERROR)returnopsresponse(serializer。data)deflist(self,request,pkNone,args,kwargs):querysetself。filterqueryset(self。getqueryset())pagesizerequest。queryparams。get(pagesize,None)ifnotpagesize:pagesizeapisettings。PAGESIZEpagination。PageNumberPagination。pagesizepagesizepageself。paginatequeryset(queryset)ifpageisnotNone:serializerself。getserializer(page,manyTrue)returnself。getpaginatedresponse(serializer。data)serializerself。getserializer(queryset,manyTrue)returnopsresponse({list:serializer。data,total:queryset。count()})defupdate(self,request,args,kwargs):instanceself。getobject()partialkwargs。pop(partial,False)try:request。data〔name〕request。data〔name〕。strip()。replace(,)exceptBaseExceptionase:logger。warning(f不包含name字段:{str(e)})serializerself。getserializer(instance,datarequest。data,partialpartial)ifnotserializer。isvalid():returnopsresponse({},successFalse,errorCode40000,errorMessageserializer。errors)try:self。performupdate(serializer)exceptBaseExceptionase:returnopsresponse({},successFalse,errorCode50000,errorMessagestr(e))ifgetattr(instance,prefetchedobjectscache,None):instance。prefetchedobjectscache{}data{data:serializer。data,status:success,code:20000}returnopsresponse(serializer。data)defretrieve(self,request,args,kwargs):instanceself。getobject()serializerself。getserializer(instance)returnopsresponse(serializer。data)defdestroy(self,request,args,kwargs):instanceself。getobject()try:self。performdestroy(instance)exceptProtectedError:存在关联数据,不可删除returnopsresponse({},successFalse,errorCode40300,errorMessage存在关联数据,禁止删除!)exceptBaseExceptionase:logger。exception(f删除数据发生错误{e},{e。class})returnopsresponse({},successFalse,errorCode50000,errorMessagef删除异常:{str(e)})returnopsresponse(删除成功)classAutoModelParentViewSet(AutoModelViewSet):defgetqueryset(self):assertself。querysetisnotNone,(sshouldeitherincludeaquerysetattribute,oroverridethegetqueryset()method。self。class。name)querysetself。extendfilter(self。queryset)ifself。actionlist:ifnotself。request。queryparams。get(search):querysetqueryset。filter(parentisnullTrue)ifisinstance(queryset,QuerySet):querysetqueryset。all()returnqueryset。distinct()自定义权限校验!usrbinenvpythonencoding:utf8author:CharlesLaifile:permissions。pytime:2023032615:27contact:qqinglaihotmail。comhereputtheimportlibfromrestframework。permissionsimportBasePermissionfromconfigimportplatformimportloggingloggerlogging。getLogger(name)classRbacPermission(BasePermission):自定义权限classmethoddefcheckisadmin(cls,request):returnrequest。user。isauthenticatedandrequest。user。roles。filter(name管理员)。count()0classmethoddefgetpermissionfromrole(cls,request):try:permsrequest。user。roles。values(permissionsmethod,)。distinct()return〔p〔permissionsmethod〕forpinperms〕exceptAttributeError:return〔〕defhaspermission(self,request,view):权限获取方式从permsmap中获取,通过request。method,http请求方法来获取对应权限点1。默认格式permsmap({:(admin,管理员)},{:(k8sall,k8s管理)},{get:(k8slist,查看k8s)},{post:(k8screate,创建k8s)},{put:(k8sedit,编辑k8s)},{delete:(k8sdelete,删除k8s)})2。自定义方法格式permsmap({gettestdata:(gettestdata,获取测试数据)},)此时格式为{http请求方法}{ViewSet自定义action}:paramrequest:restframeworkrequest对象:paramview:restframeworkview对象:return:methodrequest。request。method。lower()urlwhitelistplatform〔whitelist〕ifplatformelse〔〕pathinforequest。pathinfoforiteminurlwhitelist:urlitem〔url〕ifurlinpathinfo:logger。debug(f请求地址{pathinfo}命中白名单{url},放行)returnTrueissuperuserrequest。user。issuperuser超级管理员或者白名单模式直接放行ifissuperuser:logger。debug(f用户{request。user}是超级管理员,放行issuperuser{issuperuser})returnTrueisadminRbacPermission。checkisadmin(request)permsself。getpermissionfromrole(request)不是管理员且权限列表为空的情况下,直接拒绝ifnotisadminandnotperms:logger。debug(f用户{request。user}不是管理员且权限列表为空,直接拒绝)returnFalsepermsmapview。permsmap未配置权限映射的视图一律禁止访问ifnothasattr(view,permsmap):logger。debug(f未配置权限映射的视图一律禁止访问{view})returnFalsecustommethodNonedefaultfuncs〔create,list,retrieve,update,destroy〕actionview。actioncustommethodf{method}{action}foriinpermsmap:logger。debug(fpermsmapitem{i})formethod,aliasini。items():如果是管理员,判断当前permsmap是否带有{:(admin,管理员)}标记,如果有,则当前ViewSet所有方法全放行ifisadminand(methodandalias〔0〕admin):logger。debug(管理员判断通过,放行)returnTrue如果带有某个模块的管理权限,则当前模块所有方法都放行ifmethodandalias〔0〕inperms:logger。debug(模块管理权限判断通过,放行)returnTrue判断自定义action的情况{gettestdata:(gettestdata,获取测试数据)},{testdata:(gettestdata,获取测试数据)},ifcustommethodandalias〔0〕inpermsand(custommethodmethodormethodf{action}):logger。debug(自定义action权限判断通过,放行)returnTrue判断是否拥有ViewSet某个方法的权限,有则放行{get:(workflowlist,查看工单)},ifmethodmethodandalias〔0〕inperms:logger。debug(f{method}方法权限判断通过,放行)returnTruelogger。debug(f{pathinfo}没有符合条件的,则默认禁止访问)returnFalsedefhaspermission(self,request,view):resself。haspermission(request,view)记录权限异常的操作ifnotres:passreturnresclassAdminPermission(BasePermission):defhaspermission(self,request,view):ifRbacPermission。checkisadmin(request):returnTruereturnFalseclassObjPermission(BasePermission):密码管理对象级权限控制defhasobjectpermission(self,request,view,obj):permsRbacPermission。getpermissionfromrole(request)ifadmininperms:returnTrueelifrequest。user。idobj。uidid:returnTrue更新cmdb模块视图
  我们之前已经完成的viewcmdb。py文件里,有几处需要更新:
  1、将viewsets。ModelViewSet更改成公共视图里的AutoModelViewSet
  2、将Response更改成opsreponse,确保返回内容格式一致。运行项目(venv)ydevopsbackendcdhomecharlesydevopsbackend;usrbinenvhomecharlesydevopsbackendvenvbinpythonhomecharles。vscodeserverextensionsmspython。python2023。5。10791008pythonFileslibpythondebugpyadapter。。。。debugpylauncher41223homecharlesydevopsbackendmanage。pyrunserver0。0。0。0:9000WatchingforfilechangeswithStatReloaderPerformingsystemchecks。。。Systemcheckidentifiednoissues(0silenced)。March26,202318:50:30Djangoversion4。1。7,usingsettingsdevopsbackend。settingsStartingdevelopmentserverathttp:0。0。0。0:9000QuittheserverwithCONTROLC。
  访问接口文档http:localhost:9000apidoc
  在这个页面,我们可以做一些CRUD操作,如查看环境(由于数据量小,可以先把settings。py里的默认PAGESIZE改为1)
  Okay,今天先到这吧。。。

AMD锐龙7000非X系列处理器曝光,TDP全系为65W随着英特尔13代酷睿的正式开售,AMD方面的销售压力可以说是逐渐增大,13代酷睿处理器凭借着较好的性能释放,依旧保持着自身在芯片领域的竞争力,于是AMD便想通过推出更多细化类别……(新华全媒)53次!长征系列运载火箭年度发射次数再创新高新华社北京12月29日电题:53次!长征系列运载火箭年度发射次数再创新高新华社记者胡喆、宋晨12月29日午间,长征三号乙运载火箭成功将试验十号02星送入预定轨道。这……遇见是一种美丽尘世依旧,思绪沉淀在时光里散发出淡淡的幽香,惊醒了深眠的惆怅。微忆,时光泛起的涟漪,谁的影子在指尖轻舞,跳跃起在心灵深处。我该放下什么又该抓紧什么,此刻我该做的是什么……移动博物馆开到谢晋故里,一脚踏入大导演的片场明年是谢晋导演一百周年诞辰。电影是他的终生事业。我们希望大家从看到这个空间的第一眼,就可以遇见以谢晋导演的生命印记,所雕刻的电影元素。浙江、绍兴、上虞、谢塘、晋生,距离上……爱在深秋,我放开了她的手有没有一次离别让你刻骨铭心我放开了她的手,在那一年的秋天。时至今日,分别的一幕幕仿佛就在眼前一般,是那么的清晰可见,也是那么的让我无法理解,彼此憧憬的未来怎么就滑落泽国,……iPhone不送充电头究竟是环保还是抠门?说穿了都是利益要说近段时间以来科技数码领域最热门的话题毫无疑问就是中秋节前刚刚发布的苹果iPhone14系列。可以看到,这几天无论是各大科技媒体,还是数码发烧友间茶余饭后的话题,无一不是围绕……年轻人十大解压新业态出炉,解压经济带火线下服务消费现代社会的快节奏,让年轻人在工作之余愈发向内追求精神治愈,通过运动、创作等方式获得解压,而这些需求也正在催热一些新兴业态,激活本地解压经济。近日,服务零售平台美团基于对线……华为苹果都在抢!手机卫星通信是什么?不久前结束的华为以及苹果的发布会,相信小伙伴们都有关注吧。可能大多数小伙伴关注的是手机的配置和价格,但老狐注意到,两家公司都介绍了自己的手机卫星通信功能。这让老狐也……低压高的本质原因是什么哪些降压药对低压高有效从高血压分布人群看:中老年人大多是高压高,中青年人是低压高,还有一部分人两者都高,多见于老年人。无论上述哪种情况均属于高血压,高血压的严重性大家已经意识到,今天就来科普一下低血……北京奥运名将的师徒爱情!嫁大21岁恩师,爱女随妈姓,官至副局在咱们中国体坛,师徒恋这样的事情并不稀罕,游泳名将刘子歌就嫁给了自己的恩师金炜。前福建女排队员李东红就嫁给了恩师陈忠和。在中国举坛,举重名将陈艳青也是嫁给了自己的恩师。说……京媒利夫与首钢队已经汇合尼克约翰逊已抵达北京直播吧9月6日讯据京媒报道,首钢双外援中利夫已到队,尼克约翰逊也已经抵达北京。此前定于在重庆的季前赛则因疫情取消。微博原文如下:最新消息!原定于本周中进行的首钢公开课可能……退役军人优待证,景区景点免门票,来了各位战友大家好,退役军人优待证,景区景点免门票,好政策来了。我们的战友,目前很多战友都已经拿到了退役军人优待证,拿到了退役军人优待证之后,大家其实很希望能够享受到一种比较……
广东迎越冬候鸟迁徙高峰黄嘴白鹭、黑脸琵鹭、白琵鹭、黄胸鹀随着初冬季节到来,北方气温大幅度下降,大批候鸟再次回到南粤湿地,它们时而觅食嬉戏,时而翩翩起舞,时而展翅翱翔,为冬日的湿地增添了无限生机。据广……一眼便是万年,解密峡谷里的国家级旅游度假区记录都是用来打破的,更是用来创造的。11月7日,《文化和旅游部关于拟确定15家旅游度假区为国家级旅游度假区的公示》公布,浙江省仅2个项目成功入围,泰顺廊桥氡泉旅游度假区、……魔域手游2军团辉煌等你来创这一次就来聊聊军团系统吧!军团战是《魔域》IP的经典玩法,是团队之间的战场PK,注重团队精神和团队荣誉,军团玩法也是这款游戏的特点之一,军团的作用很大,可以社交活动,可以提高战……冬天了,爱它就去泡它吧这几天,成都断崖式降温,真的把冬的凛冽粗暴地填满了成都的大街小巷。是的,冬来了,那泡温泉,应该是打开冬天最正确的方式!周末两天,成都人总爱就进找一些隐秘的地方自在。一头扎进大自……跨境电商综合试验区再扩围江西省赣州市积极推进赣州国际陆港、赣州综合保税区与中国(赣州)跨境电子商务综合试验区三区合一,实现中欧班列跨境电商融合发展。图为赣州国际陆港铁路场站的繁忙景象。朱海鹏摄(人民视……前三季度,珠海智能家电产业规上工业总产值超800亿元今年4月,珠海产业发展大会明确提出,要聚焦新一代信息技术、新能源、集成电路、生物医药与健康4大主导产业,以及智能家电、装备制造、精细化工3大优势产业,迅速做大做强珠海43支柱产……刘嘉玲的洁癖有多严重?舒淇用了她家卫生间后,她当我面拆掉对于洁癖的人,相信大家经常见,而小编也是有着轻微洁癖的人,每次都会复洗手、反复洗涤衣物,明知过分,但无法自控。而在娱乐圈有洁癖的明星比比皆是,比如马苏,拍《白发魔女传》的……父母是孩子的噩梦记得,这是第三次听见孩子在睡梦中哭泣了。之所以记得这么清楚是因为:孩子的悲喜永远连着父母的心。我问他,为什么哭,做了什么噩梦?第一次他告诉我,因为不认真,我让……林语堂在爱与不爱间游走头条创作挑战赛通达顿悟的人生我不是哲人,写不出流传万世之作,但是我记得尼采,他说生命创造灵魂启发未知。现代人亚健康遍地,多半都在内卷中被生存着,少有的睿智也被三个铜板两片……梁振鹏性能过剩是制约手机出货量的原因吗?中新经纬11月16日电题:性能过剩是制约手机出货量的原因吗?作者梁振鹏资深产业经济观察家、消费电子行业分析师2022年以来,国产手机品牌出货量下降较为明显,据中国信……从封神到作下神坛,弗利克要为德国队的灾难埋单2022世界杯体坛周报全媒体记者黄思隽弗利克用了短短15个月就在拜仁连夺6冠而封神;回到德国国家队之后,他也恰好用了15个月将自己彻底地作下神坛。从去年9月2日首秀2比0……中国最好吃的5种咸菜,3个在南方,2个在北方,有你吃过的吗?咸菜在我国可谓是家家户户都有的食物,在古代,人们发明了腌制咸菜的办法,将蔬菜腌起来,因为大量的糖和盐可以阻止细菌的滋生,从而延长食物的保存时间,如今,各种各样的咸菜越来越多,咸……
友情链接:易事利快生活快传网聚热点七猫云快好知快百科中准网快好找文好找中准网快软网