獲取Django專案的全部url方法詳解

2023-03-19 01:35:41 字數 2762 閱讀 9526

在為一個專案新增許可權時,遇到一個問題,就是為專案所有的url設定許可權,但是一個一個手動輸入太麻煩了,所以考慮用**獲取到一個專案所有的url

首先,考慮到專案最外層的urlpartterns,因為所有的url都要通過這裡

urlpatterns = [

# url(r'^admin/', admin.site.urls),

url(r'^arya/', site.urls),

url(r'^index/', index),

]先迴圈列印一下這個列表,看一下拿到的結果:

(arya:arya) ^arya/>

&l 程式設計客棧ac\\urls.py'> (none:none) ^rbac/>

可以看到,直接有對應函式的和通過檔案匯入的這種巢狀的,列印出來的型別是不一樣的,匯入一下這個型別

from django.urls.resolvers import regexurlpattern

from 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,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,pr程式設計客棧ev='/'))

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),

]這樣就拿到了這個專案所有的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/ajhoeyadd/', '/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

django1.10快速獲取專案所有的url列表,可以用於許可權控制 函式如下 import re def get url urllist parent depth 0 url list url dict for entry in urllist url entry.regex.pattern if...

VSS 獲取全部子檔案

dynamsoft sourceanywhere for vss 點選獲取檔案,沒有遞迴獲取全部資料夾及檔案,也沒有提示recursive 遞迴 的對話方塊。這時也不能一個個的去獲取。解決辦法 按住shift鍵,再獲取就會彈出對話方塊,並且設定 only show this dialog when ...