鍓嶈█DjangoREST妗嗘灦锛圖RF锛夋槸涓€涓己澶ц€岀伒娲荤殑WebAPI鏋勫缓宸ュ叿鍖呫€侱RF鏈夎嚜宸辩殑涓€濂楄矾鐢卞畾涔夋柟娉曪紝鍗抽€氳繃Router绫诲瀷鐨剅egister鏂规硶锛屽叾涓寘鍚竴涓悕涓篵asename鐨勫弬鏁般€傝鎴戜滑閫氳繃浜嗚В杩欎釜鍙傛暟鏉ヤ簡瑙RF鐨勮矾鐢辩郴缁燂紒鎺㈢┒浠€涔堥棶棰橈紝涓轰粈涔堝啓杩欑瘒鏂囩珷锛屽洜涓哄湪浣跨敤DjangoRESTframework鐨勬椂鍊欙紝缁忓父浼氱湅鍒伴厤缃矾鐢辨椂basename鐨勭敤娉曪紝绫讳技浜嶥jango涓璱nclude鍑芥暟涓殑namespace鍙傛暟鍜宲ath涓殑name鍙傛暟銆傜湡鐩告槸鎬庢牱鐨勶紵璇疯鎴戜滑甯︾潃浠ヤ笅涓変釜闂鏉ョ湅杩欑瘒鏂囩珷锛侌煈嘍jangoRESTframework涓殑basename涓嶥jango涓殑namespace鍙傛暟鍜宯ame鍙傛暟鏈変粈涔堝叧绯伙紵浠€涔堟椂鍊欓渶瑕佸姞basename锛屼粈涔堟椂鍊欎笉闇€瑕佸姞basename锛熷鏋滈粯璁や簡basename鍙傛暟锛孌jangoRESTFramework浼氬浣曞鐞嗗憿锛熸墍闇€鍓嶇疆鐭ヨ瘑鏍规嵁DjangoRESTframework瀹樻柟鏂囨。浠嬬粛锛歊outers-EnglishDocumentation|Routers-ChineseDocumentation鍦ㄥ洖绛旂涓€涓棶棰樻椂锛岄渶瑕佸厛浜嗚Вrouter.register銆傝鎯呰鐪嬭繖绡囨枃绔犱娇鐢―RFWhenchoosingrouter.registerorurlpatternspath?锛燂紵浣滅敤鍦ㄥ摢閲岋細鏂偣锛氭煡鐪嬪彉閲忎俊鎭彲浠ュ彂鐜癰asename鍙傛暟褰卞搷浜哢RLPattern鐨刵ame灞炴€с€傝繖涓猲ame灞炴€у氨鏄嫾鎺ョ殑瀹為檯搴旂敤锛歜asename涓昏鐢ㄥ湪鍙嶅悜瑙f瀽涓€傚ぇ浣撴祦绋嬫槸url璺敱->鏌ョ湅浣嗘槸鏈夋椂鍊欓渶瑕佸湪瑙嗗浘涓€氳繃view鑾峰彇url锛屾瘮濡傞噸瀹氬悜銆傝繖鏃跺€欏氨鍙互浣跨敤basename鏉ュ仛杞紪鐮佷簡銆傚綋basename涓篸efault鏃讹紝濡傛灉basename鍙傛暟涓篸efault锛岄偅涔堝皢浣跨敤viewset鍙傛暟鐨剄ueryset灞炴€с€傚鏋滄病鏈夋寚瀹歷iewset鍙傛暟鐨剄ueryset灞炴€ц€屾寚瀹氫簡basename鍙傛暟锛屽垯浼氭姤閿欙紒鏂囦欢鈥淐:\Users\17293\Desktop\Coder\Python\Django\twitter\twitter\urls.py鈥濓紝绗?7琛岋紝鍦?module>router.register('/api/accounts/',AccountViewSet)鏂囦欢鈥淐:\Users\17293\AppData\Local\Programs\Python\Python39\lib\site-packages\rest_framework\routers.py鈥濓紝绗?4琛岋紝鍦ㄦ敞鍐宐asename=self.get_default_basename(viewset)鏂囦欢鈥淐:\Users\17293\AppData\Local\Programs\Python\Python39\lib\site-packages\rest_framework\routers.py鈥濓紝绗?37琛岋紝鍦╣et_default_basename鏂█鏌ヨ闆嗕笉鏄棤锛屾湭鎸囧畾'`basename`鍙傛暟锛屽苟涓斿彲鑳?\AssertionError锛氭湭鎸囧畾`basename`鍙傛暟锛屽苟涓旀棤娉曚粠瑙嗗浘闆嗕腑鑷姩纭畾鍚嶇О锛屽洜涓哄畠娌℃湁`.queryset`灞炴€с€傜湅婧愮爜锛屼竴鍒囩枒鎯戦兘鍙互鍦ㄦ簮鐮佷腑瑙e喅銆侱jangoREST妗嗘灦涓殑璺敱娉ㄥ唽鏄繖鏍风殑router=routers.SimpleRouter()router.register('/api/accounts/',AccountViewSet,basename='accounts')basename鍙傛暟鍙互鍐欎篃鍙互涓嶅啓銆傚鏋滄病鏈夊啓锛屼笉浠h〃娌℃湁basename锛屽洜涓轰笂闈㈣浜嗭紝鍙嶅悜鍒嗘瀽闇€瑕佺敤鍒癰asename锛屾墍浠ラ粯璁ょ殑basename浼氱粰鍑轰竴涓粯璁ゅ€笺€備笅闈㈡垜浠氨鏉ョ湅鐪媟egister鐨勬簮鐮佸惂锛佸彲浠ョ湅鍒皉egister鏂规硶鐨刡asename鍙傛暟鏈変竴涓粯璁ゅ€糔one锛屼絾杩欏苟涓嶆槸鏈€缁堢殑榛樿鍊硷紒浠庢簮鐮佷腑鎴戜滑鍙互鐪嬪埌锛屽綋鎴戜滑涓嶈嚜瀹氫箟杩欎釜鍙傛暟鏃讹紝榛樿涓篘one锛屽綋涓篘one鏃讹紝浼氫粠viewset鍙傛暟绫籅aseRouter涓幏鍙朾asename鐨勫€硷細def__init__(self):self.registry=[]defregister(self,prefix,viewset,basename=None):ifbasenameisNone:basename=self.get_default_basename(viewset)self.registry.append((prefix,viewset,basename))#浣縰rls缂撳瓨鏃犳晥ifhasattr(self,'_urls'):delself._urls濡傛灉浣犳湁涓€涓棶棰橈細涓轰粈涔堟垜浠湪urls.py涓殑鑷畾涔夎矾鐢变腑浣跨敤SimpleRouter绫荤殑瀵勫瓨鍣紝涓轰粈涔堣繖閲屾樉绀虹殑婧愮爜鏄疊aseRouter绫伙紵绛旀鏄洜涓篠impleRouter绫荤殑register鏂规硶缁ф壙鑷狟aseRouter绫汇€係impleRouter绫讳笉浼氶噸鍐檙egister鏂规硶銆傛帴涓嬫潵锛岃鎴戜滑鐪嬬湅濡備綍鑾封€嬧€嬪彇榛樿鐨刡asename銆備粠婧愮爜涓垜浠彲浠ョ湅鍑篵asename=self.get_default_basename(viewset)杩欏彞璇濇槸鏈夋晥鐨勶紝閭d箞鎴戜滑鏉ョ湅涓€涓媠elf.get_default_basename鏂规硶馃憞棣栧厛鏉ョ湅涓€涓婤aseRouter绫荤殑get_default_basename鏂规硶锛宔mmmm,杩欐槸涓€涓娊璞℃柟娉昫efget_default_basename(self,viewset):"""濡傛灉娌℃湁鎸囧畾`basename`,灏濊瘯浠庤鍥鹃泦涓嚜鍔ㄧ‘瀹氬畠銆?""raiseNotImplementedError('get_default_basename蹇呴』閲嶅啓')涓婇潰鎻愬埌浜嗕竴涓蹇碉細abstractmethod鍏充簬abstractmethod锛屾剰鎬濇槸鐖剁被瀹氫箟浜嗕竴涓柟娉曪紝璋冪敤杩欎釜鏂规硶灏变細鎶ラ敊锛屽搱鍝堬紝浣犳槸涓嶆槸寰堝鎬紝涓轰粈涔堣鍋氬嚭杩欑浜嬫伓蹇冧汉锛熸墦鐢佃瘽鎶ラ敊锛熶负浠€涔堬紵涓轰粈涔堬紵浣犲湪骞蹭粈涔堬紵鍦ㄥ洖绛斾负浠€涔堣瀹氫箟杩欎箞鎭跺績鐨勬娊璞℃柟娉曚箣鍓嶏紝鎴戜滑鍏堟潵鐪嬬湅濡備綍浣跨敤杩欎釜鏂规硶銆傛娊璞℃柟娉曠殑姝g‘鎵撳紑鏂瑰紡鏄湪瀛愮被涓户鎵跨埗绫伙紝鍦ㄥ瓙绫讳腑閲嶅啓鐖剁被銆傛娊璞℃柟娉曪紝鍗冲瓙绫讳腑涓嶆姏鍑洪敊璇殑鑷畾涔夋柟娉曢偅涓轰粈涔堢埗绫讳細鏈夎繖涔堜竴涓娊璞℃柟娉曞憿锛熷洜涓鸿繖涓娊璞℃柟娉曞緢閲嶈锛堜笉鏄娊璞℃柟娉曞緢閲嶈锛屾槸杩欎釜鏂规硶锛岃繖涓彨鎶借薄鏂规硶锛屼竴璋冪敤灏辨姏鍑洪敊璇殑鏂规硶寰堥噸瑕侊紝涓嶆槸鈥滄娊璞♀€濆洓涓瓧鏂规硶鈥濇垨鑰呪€滄娊璞℃柟娉曗€濊繖鍥涗釜瀛楁墍鎸囩殑閭g涓滆タ寰堥噸瑕侊紒锛侊紒锛夛紝鏃㈢劧瑕侀噸鍐欐墠鑳戒娇鐢紝閭h繕涓嶅涓嶅畾涔夊湪鐖剁被涓紝涓嶆槸鍚楃洿鎺ュ啓鍦ㄥ瓙绫婚噷濂戒笉濂斤紵涔熷彲浠ワ紒缁濆鍙互锛侀偅涔堜负浠€涔堣瀹氫箟杩欎釜鎶涘嚭閿欒鐨勬柟娉曞憿锛熺瓟妗堟槸鍗犱釜鍧戯紝鎻愰啋鍐欏瓙绫荤殑浜猴紝涓嶈蹇樿杩欎釜閲嶈鐨勬柟娉曪紒锛侊紒杩樻湁涓€鐐癸紝濡傛灉涓嶇户鎵匡紝ide锛屾瘮濡倂scode锛宲ycharm锛屼細鎻愮ず璇硶閿欒銆傛瘯绔熶綘鍦˙aseRouter绫荤殑register鏂规硶涓皟鐢ㄤ簡get_default_basename鏂规硶锛屼絾鏄綘杩樻病鏈夊畾涔塯et_default_basename鏄粈涔堬紵锛燂紵鐒跺悗杩欎簺ides浼氱粰浣犻敊璇彁绀猴紒锛侊紒鎵€浠ユ垜浠渶瑕佸崰涓潙锛屽畾涔変竴涓亣鐨刧et_default_basename鎬荤粨锛氬憡璇夋兂鍐欏瓙绫荤殑浜猴紝涓嶈蹇樿閲嶅啓杩欎釜鎶借薄鏂规硶锛堥噸瑕侊級鍗犱釜鍧戯紝淇濊瘉浠g爜鐨勫畬鏁存€э紙涓嶆槸閭d箞閲嶈锛夋垜浠湅涓€涓婼impleRouter绫荤殑get_default_basename鏂规硶defget_default_basename(self,viewset):"""濡傛灉娌℃湁鎸囧畾`basename`锛屽皾璇曚粠viewset涓嚜鍔ㄥ垽鏂€?""queryset=getattr(viewset,'queryset',None)assertquerysetisnotNone,'`basename`鍙傛暟鏈寚瀹氾紝骞朵笖鍙兘'\'涓嶄細鑷姩浠庤鍥鹃泦涓‘瀹氬悕绉帮紝鍥犱负'\'瀹冩病鏈塦.queryset`灞炴€с€傝繑鍥炴煡璇㈤泦.model銆俖meta.object_name.lower()getattr(viewset,'queryset',None)璇彞棣栧厛閫氳繃getattr鍑芥暟鑾峰彇viewset瀵硅薄涓殑queryset灞炴€с€傚鏋滃睘鎬т笉瀛樺湪涔熶笉杩斿洖None锛岄偅涔坴iewset瀵硅薄鏄粈涔堬紵鍥炲ご锛乺outer.register('/api/accounts/',AccountViewSet,basename='accounts')defregister(self,prefix,viewset,basename=None):basename=self.get_default_basename(viewset)鎵€浠ワ紝viewset瀵硅薄灏辨槸AccountViewSetclass锛岃繖涓被娌℃湁鑷繁鐨剄ueryset灞炴€с€傚畠闇€瑕佷汉绫汇€佺▼搴忓憳鍜岄渶瑕佸潗鍦ㄧ數鑴戝墠鐨勪綘銆傚畾涔夎捣鏉ュ緢绠€鍗曪紝浣嗘槸鐩镐俊鐪嬪埌杩欑瘒鏂囩珷鐨勬柊鎵嬪緢澶氾紝鎵€浠ユ兂璇磋銆備粙缁嶇殑姣旇緝澶氫竴鐐癸紝涓嶇煡閬揼etattr鍑芥暟鏄共浠€涔堢殑锛熼偅浣犵湡鐨勫簲璇ュ鍘诲紩鎿庢悳绱竴涓嬶紒浠€涔堬紵浣犵敋鑷充笉鑳戒娇鐢ㄦ悳绱㈠紩鎿庯紒濂藉惂锛屾垜鍛婅瘔浣犳悳绱㈠叧閿瓧锛屸€減ythongetattrusage鈥濅箣绫荤殑鏉$洰鍙互鎵惧埌浣犳兂瑕佺殑绛旀锛岀劧鍚庣湅鍒版柇瑷€璇彞assert锛屽鏋渜ueryset涓嶄负None锛屽垯閫氳繃锛屽鏋渜ueryset涓篘one锛屽垯涓€涓細鎶涘嚭閿欒锛佷粈涔堬紒浣犵敋鑷充笉鐭ラ亾assert锛侊紒锛佷綘绠€鐩村氨鏄竴涓煠★紝杩欐椂鍊欏氨寰堟竻妤氫簡銆傚鏋滄棦涓嶈嚜瀹氫箟basename灞炴€э紝鍙堜笉瀹氫箟AccountViewSet绫荤殑queryset灞炴€э紝灏变細鎶ラ敊鍜屼綘璇村啀瑙併€傚鏋滄病鏈夎嚜瀹氫箟basename灞炴€э紝浣嗘槸瀹氫箟浜咥ccountViewSet绫荤殑queryset灞炴€у憿锛熻繖鏃跺€欎細浣跨敤queryset绫讳綔涓篵asename锛屼絾鏄湁涓€涓皬闂锛屽氨鏄痓asename鏄竴涓瓧绗︿覆锛岃€宷ueryset寰€寰€鏄竴涓猀uerySet绫伙紝鎴栬€呮槸models.Model鐨勫瓙绫汇€傛樉鐒讹紝璇ョ被涓嶈兘鐢ㄤ綔瀛楃涓层€傝繖鏃跺€欏氨闇€瑕佽繘涓€姝ュ鐞嗕簡锛佺劧鍚庡線涓嬬湅锛乹ueryset.model._meta.object_name.lower()鍙互鐪?lower()鏂规硶锛屾槸string绫诲瀷鐨勫唴缃柟娉曪紝璐熻矗瀛楃涓茶杞崲涓哄皬鍐欏瓧绗︺€俹bject_name鏄竴涓瓧绗︿覆瀵硅薄锛屽瓨鏀剧殑鏄疉ccountViewSet绫荤殑鍚嶇О銆傝浆涓哄皬鍐欏悗锛屽氨鍙樻垚浜哸ccountviewset銆俵ower鏂规硶涓嶆槑鐧借鍙傝€働ython3lower()鏂规硶
