獲取Django項(xiàng)目的全部url方法詳解
在為一個(gè)項(xiàng)目添加權(quán)限時(shí),遇到一個(gè)問題,就是為項(xiàng)目所有的url設(shè)置權(quán)限,但是一個(gè)一個(gè)手動(dòng)輸入太麻煩了,所以考慮用代碼獲取到一個(gè)項(xiàng)目所有的url
首先,考慮到項(xiàng)目最外層的urlpartterns,因?yàn)樗械膗rl都要通過這里
urlpatterns = [ # url(r'^admin/', admin.site.urls), url(r'^arya/', site.urls), url(r'^index/', index), ]
先循環(huán)打印一下這個(gè)列表,看一下拿到的結(jié)果:
<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/>
可以看到,直接有對應(yīng)函數(shù)的和通過文件導(dǎo)入的這種嵌套的,打印出來的類型是不一樣的,導(dǎo)入一下這個(gè)類型
from django.urls.resolvers import RegexURLPattern from django.urls.resolvers import RegexURLResolver
按住ctrl點(diǎn)進(jìn)去看一下源碼,找來找去看到有個(gè)
self._regex = regex
拿到代碼中打印一下這個(gè),拿到:
^arya/ ^rbac/ ^index/
哇,妙啊,但是這個(gè)只能是最后一個(gè)有用,上面兩個(gè)還有嵌套,我們通過上面拿到的兩種類型區(qū)分一下
對于這種有嵌套的,可以使用遞歸來一層一層的扒開它,直到拿到的是 RegexURLPattern 類型
而且,每扒開一層,它的url得加上之前的那個(gè)
我們可以通過 item.urlconf_name 拿到嵌套的里面一層的urlpartterns
這里面還涉及一個(gè)問題就是,用遞歸函數(shù)的話,如何保存每次得到的結(jié)果?
可以用一個(gè)全局變量,沒有問題,其實(shí)還可以用一個(gè)Python的特性,就是如果參數(shù)的默認(rèn)值為字典,列表這種可變數(shù)據(jù)類型的話,以后引用的都是同一個(gè)內(nèi)存地址
所以這個(gè)全局變量還可以寫成是一個(gè)默認(rèn)是個(gè)空列表的參數(shù),但是這樣又出了新的問題,就是只要不重啟項(xiàng)目,這個(gè)列表一直不清空,所以再用一個(gè)默認(rèn)參數(shù)為False,第一次調(diào)用的時(shí)候把這個(gè)參數(shù)設(shè)置為True,在函數(shù)中判斷如果這個(gè)參數(shù)為True,就清空列表。
最終代碼可以寫成這樣:
from django.conf.urls import url,include
from arya.service.sites import site
from django.urls.resolvers import RegexURLPattern
from django.urls.resolvers import RegexURLResolver
from django.shortcuts import HttpResponse
def 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 result
urlpatterns = [
url(r'^arya/', site.urls),
url(r'^index/', index),
]
這樣就拿到了這個(gè)項(xiàng)目所有的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/']
總結(jié)
以上就是本文關(guān)于獲取Django項(xiàng)目的全部url方法詳解的全部內(nèi)容,希望對大家有所幫助。感興趣的朋友可以繼續(xù)參閱本站:Python探索之ModelForm代碼詳解、基于Python和Scikit-Learn的機(jī)器學(xué)習(xí)探索等,如有不足之處,歡迎大家留言指出。感謝朋友們對本站的支持!
相關(guān)文章
Python使用鄰接矩陣實(shí)現(xiàn)圖及Dijkstra算法問題
這篇文章主要介紹了Python使用鄰接矩陣實(shí)現(xiàn)圖及Dijkstra算法問題,具有很好的參考價(jià)值,希望對大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-12-12
python實(shí)現(xiàn)區(qū)間合并的方法
區(qū)間合并是指將重疊的區(qū)間合并為一個(gè)或多個(gè)不重疊的區(qū)間,本文主要介紹了python實(shí)現(xiàn)區(qū)間合并的方法,文中通過代碼介紹的很詳細(xì),感興趣的可以了解一下2024-02-02
BeautifulSoup中find和find_all的使用詳解
這篇文章主要介紹了BeautifulSoup中find和find_all的使用詳解,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-12-12
Pandas對每個(gè)分組應(yīng)用apply函數(shù)的實(shí)現(xiàn)
這篇文章主要介紹了Pandas對每個(gè)分組應(yīng)用apply函數(shù)的實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-12-12
Pandas中DataFrame.head()函數(shù)的具體使用
DataFrame.head()是Pandas庫中一個(gè)非常重要的函數(shù),用于返回DataFrame對象的前n行,本文主要介紹了Pandas中DataFrame.head()函數(shù)的具體使用,感興趣的可以了解一下2024-07-07
Python實(shí)現(xiàn)老照片修復(fù)之上色小技巧
你會黑白照片上色嗎,今天小編帶你用python來給黑白照片上個(gè)色,這里我們借助百度AI開放平臺的“黑白圖像上色”接口,僅需二十行代碼即可實(shí)現(xiàn),感興趣的朋友來看看吧2021-10-10

