国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > Python > 正文

獲取Django項目的全部url方法詳解

2020-01-04 16:40:01
字體:
來源:轉載
供稿:網友

在為一個項目添加權限時,遇到一個問題,就是為項目所有的url設置權限,但是一個一個手動輸入太麻煩了,所以考慮用代碼獲取到一個項目所有的url

首先,考慮到項目最外層的urlpartterns,因為所有的url都要通過這里

urlpatterns = [  # url(r'^admin/', admin.site.urls),  url(r'^arya/', site.urls),  url(r'^index/', index),]

先循環打印一下這個列表,看一下拿到的結果:

<RegexURLResolver <RegexURLPattern list> (arya:arya) ^arya/><RegexURLResolver <module 'rbac.urls' from 'C://Users//zhangcan//Desktop//pro_crm//pro_crm//rbac//urls.py'> (None:None) ^rbac/><RegexURLPattern None ^index/>

可以看到,直接有對應函數的和通過文件導入的這種嵌套的,打印出來的類型是不一樣的,導入一下這個類型

from django.urls.resolvers import RegexURLPatternfrom django.urls.resolvers import RegexURLResolver

按住ctrl點進去看一下源碼,找來找去看到有個

self._regex = regex

拿到代碼中打印一下這個,拿到:

^arya/^rbac/^index/

哇,妙啊,但是這個只能是最后一個有用,上面兩個還有嵌套,我們通過上面拿到的兩種類型區分一下

對于這種有嵌套的,可以使用遞歸來一層一層的扒開它,直到拿到的是  RegexURLPattern  類型

而且,每扒開一層,它的url得加上之前的那個

我們可以通過   item.urlconf_name   拿到嵌套的里面一層的urlpartterns

這里面還涉及一個問題就是,用遞歸函數的話,如何保存每次得到的結果?

可以用一個全局變量,沒有問題,其實還可以用一個Python的特性,就是如果參數的默認值為字典,列表這種可變數據類型的話,以后引用的都是同一個內存地址

所以這個全局變量還可以寫成是一個默認是個空列表的參數,但是這樣又出了新的問題,就是只要不重啟項目,這個列表一直不清空,所以再用一個默認參數為False,第一次調用的時候把這個參數設置為True,在函數中判斷如果這個參數為True,就清空列表。

最終代碼可以寫成這樣:

from django.conf.urls import url,includefrom arya.service.sites import sitefrom django.urls.resolvers import RegexURLPatternfrom django.urls.resolvers import RegexURLResolverfrom django.shortcuts import HttpResponsedef index(request):  print(get_all_url(urlpatterns,prev='/'))  return HttpResponse('...')def get_all_url(urlparrentens,prev,is_first=False,result=[]):  if is_first:    result.clear()  for item in urlparrentens:    v = item._regex.strip('^$')#去掉url中的^和$    if isinstance(item,RegexURLPattern):      result.append(prev + v)    else:      get_all_url(item.urlconf_name,prev + v)  return resulturlpatterns = [  url(r'^arya/', site.urls),  url(r'^index/', index),]

這樣就拿到了這個項目所有的url

['/arya/login/', '/arya/logout/', '/arya/app01/department/', '/arya/app01/department/add/', '/arya/app01/department/(.+)/delete/', '/arya/app01/department/(.+)/change/', '/arya/app01/userinfo/', '/arya/app01/userinfo/add/', '/arya/app01/userinfo/(.+)/delete/', '/arya/app01/userinfo/(.+)/change/', '/arya/rbac/userinfo/', '/arya/rbac/userinfo/add/', '/arya/rbac/userinfo/(.+)/delete/', '/arya/rbac/userinfo/(.+)/change/', '/arya/rbac/role/', '/arya/rbac/role/add/', '/arya/rbac/role/(.+)/delete/', '/arya/rbac/role/(.+)/change/', '/arya/rbac/permission/', '/arya/rbac/permission/add/', '/arya/rbac/permission/(.+)/delete/', '/arya/rbac/permission/(.+)/change/', '/arya/rbac/menu/', '/arya/rbac/menu/add/', '/arya/rbac/menu/(.+)/delete/', '/arya/rbac/menu/(.+)/change/', '/index/']

總結

以上就是本文關于獲取Django項目的全部url方法詳解的全部內容,希望對大家有所幫助。感謝朋友們對本站的支持!

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 电白县| 宿松县| 滦南县| 武定县| 安阳县| 吉林省| 遂平县| 廉江市| 清水县| 烟台市| 北辰区| 浦东新区| 洱源县| 康乐县| 昌宁县| 沙洋县| 淮安市| 长丰县| 育儿| 福泉市| 宾阳县| 金坛市| 岳阳县| 长白| 阜城县| 辽源市| 宁化县| 青州市| 永福县| 姜堰市| 伊吾县| 山阳县| 白水县| 延庆县| 久治县| 池州市| 平遥县| 嘉定区| 句容市| 阿尔山市| 永州市|