在為一個專案新增許可權時,遇到一個問題,就是為專案所有的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 ...