" />

欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Django3.2 自動(dòng)發(fā)現(xiàn)所有路由代碼詳解

 更新時(shí)間:2021年12月03日 15:58:06   作者:GouHuang  
這篇文章主要為大家介紹了Django自動(dòng)發(fā)現(xiàn)所有路由的方法,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來(lái)幫助

1.需求

發(fā)現(xiàn)項(xiàng)目本地所有帶別名的URL,組成一個(gè)有序字典,方便后續(xù)調(diào)用;
定向排除部分URL,如Django自帶的 admin下的路由;

2.代碼實(shí)現(xiàn)

import re              # 正則
from collections import OrderedDict      # 創(chuàng)建有序字典
from django.conf import settings          # 導(dǎo)入setting配置文件(獲取項(xiàng)目根路徑urls.py)
from django.utils.module_loading import import_string      # 字符串導(dǎo)入模塊
from django.urls import URLPattern, URLResolver            # Django自定義的類,可以判斷當(dāng)前URL是否為根路徑(URLPattern)或繼續(xù)向下分發(fā)(URLResolver )

def check_url_exclude(url):
    """
    排除一些特定的URL
    :param url: 待檢驗(yàn)的URL
    :return:
    """
    for regex in settings.AUTO_DISCOVER_EXCLUDE:     #將要定向排除的URL(可包含正則) 按照列表的形式寫(xiě)入配置文件 settings.AUTO_DISCOVER_EXCLUDE  下
        if re.match(regex, url):
            return True
"""
示例:
AUTO_DISCOVER_EXCLUDE = [
    '/admin/.*',
    '/login/',
    '/logout/',
    '/index/',
]
"""
def recursion_urls(pre_namespace, pre_url, urlpatterns, url_ordered_dict):
    """
    遞歸的去獲取URL
    :param pre_namespace: namespace前綴,用于拼接name
    :param pre_url: url前綴,用于拼接url
    :param urlpatterns: 路由關(guān)系列表
    :param url_ordered_dict: 用于保存遞歸中獲取的所有路由
    :return:
    """
    for item in urlpatterns:
        if isinstance(item, URLPattern):  # 已經(jīng)是根網(wǎng)址,獲取name及url寫(xiě)入url_ordered_dict
            if not item.name:  # 沒(méi)有別名(name)的路由地址直接跳過(guò)
                continue
            # 拼接路由別名(包含分發(fā)下來(lái)的namespace;如 "rbac:menu_list")
            if pre_namespace:
                name = "%s:%s" % (pre_namespace, item.name)
            else:
                name = item.name
            # 拼接路由地址URl(包含分發(fā)下來(lái)的上層路由;如 "/rbac/menu/list")
            url = pre_url + item.pattern.regex.pattern        # 此時(shí)拼接的路由包含起止符號(hào),如:/^rbac/^menu/list/$
            url = url.replace("^", "").replace("$", "")           # 刪除起止符:/rbac/menu/list/
            # 排除一些特定的路由URL
            if check_url_exclude(url):                             # 調(diào)用check_url_exclude函數(shù)定向排除部分URL
                continue
            url_ordered_dict[name] = {"name": name, "url": url}

        elif isinstance(item, URLResolver):  # 路由分發(fā),遞歸操作
            if pre_namespace:                                                                              # 上次循環(huán)(上一層)分發(fā)是否包含namespace
                if item.namespace:                                                                         # 本次循環(huán)(當(dāng)前層)是否包含namespace
                    namespace = "%s:%s" % (pre_namespace, item.namespace,)         # 上層、當(dāng)前層都包含直接拼接兩層的namespace
                else:
                    namespace = pre_namespace                                                      # 當(dāng)前層分發(fā)不包含namespace,直接用上一層的
            else:
                if item.namespace:
                    namespace = item.namespace                                                     # 上一層分發(fā)不包含namespace,直接使用當(dāng)前層的
                else:
                    namespace = None                                                                     # 上一層、當(dāng)前層都沒(méi)有,直接定義層none
            recursion_urls(namespace, pre_url + item.pattern.regex.pattern, item.url_patterns, url_ordered_dict)       # 遞歸繼續(xù)執(zhí)行
def get_all_url_dict():
    """
    獲取項(xiàng)目所有路由
    :return:
    """
    url_ordered_dict = OrderedDict()                                        # 包含本項(xiàng)目所有權(quán)限URl的有序字典
    md = import_string(settings.ROOT_URLCONF)                    # 配置文件內(nèi)的 ROOT_URLCONF 為本項(xiàng)目根路由urls.py 的路徑(字符串),使用 import_string 用字符串加載模塊
    recursion_urls(None, "/", md.urlpatterns, url_ordered_dict)    # 調(diào)用 recursion_urls 函數(shù)獲取所有路由字典,根路徑下沒(méi)有namespace 定義為 None;沒(méi)有url前綴 定義為 /
    return url_ordered_dict

總結(jié)

本篇文章就到這里了,希望能夠給你帶來(lái)幫助,也希望您能夠多多關(guān)注腳本之家的更多內(nèi)容!

相關(guān)文章

  • Python中的文件輸入輸出問(wèn)題

    Python中的文件輸入輸出問(wèn)題

    這篇文章主要介紹了Python中的文件輸入輸出問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-11-11
  • Python爬蟲(chóng)+tkinter界面實(shí)現(xiàn)歷史天氣查詢的思路詳解

    Python爬蟲(chóng)+tkinter界面實(shí)現(xiàn)歷史天氣查詢的思路詳解

    這篇文章主要介紹了Python爬蟲(chóng)+tkinter界面實(shí)現(xiàn)歷史天氣查詢的思路詳解,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2021-02-02
  • Python with用法:自動(dòng)關(guān)閉文件進(jìn)程

    Python with用法:自動(dòng)關(guān)閉文件進(jìn)程

    這篇文章主要介紹了Python with用法:自動(dòng)關(guān)閉文件進(jìn)程,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2019-07-07
  • python實(shí)現(xiàn)圖片轉(zhuǎn)字符畫(huà)的完整代碼

    python實(shí)現(xiàn)圖片轉(zhuǎn)字符畫(huà)的完整代碼

    這篇文章主要給大家介紹了關(guān)于python實(shí)現(xiàn)圖片轉(zhuǎn)字符畫(huà)的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2021-02-02
  • pip版本低引發(fā)的python離線包安裝失敗的問(wèn)題

    pip版本低引發(fā)的python離線包安裝失敗的問(wèn)題

    這篇文章主要介紹了pip版本低引發(fā)的python離線包安裝失敗的問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-09-09
  • 深入了解Python?中線程和進(jìn)程區(qū)別

    深入了解Python?中線程和進(jìn)程區(qū)別

    這篇文章主要介紹了深入了解Python?中線程和進(jìn)程區(qū)別,一個(gè)進(jìn)程由一個(gè)或者多個(gè)線程組成,線程是一個(gè)進(jìn)程中代碼的不同執(zhí)行路線。切換進(jìn)程需要的資源比切換線程的要多的多,下面來(lái)了解更多的詳細(xì)內(nèi)容,需要的小伙伴可以參考一下
    2022-03-03
  • 詳解Python中contextlib上下文管理模塊的用法

    詳解Python中contextlib上下文管理模塊的用法

    Python中一些內(nèi)建對(duì)象有了上下文管理器的支持,于是可以使用with語(yǔ)句來(lái)實(shí)現(xiàn)自動(dòng)的文件打開(kāi)關(guān)閉以及線程操作等,這里我們就從根基上來(lái)詳解Python中contextlib上下文管理模塊的用法
    2016-06-06
  • TensorFlow 模型載入方法匯總(小結(jié))

    TensorFlow 模型載入方法匯總(小結(jié))

    這篇文章主要介紹了TensorFlow 模型載入方法匯總(小結(jié)),小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2018-06-06
  • Python while循環(huán)使用else語(yǔ)句代碼實(shí)例

    Python while循環(huán)使用else語(yǔ)句代碼實(shí)例

    這篇文章主要介紹了Python while循環(huán)使用else語(yǔ)句代碼實(shí)例,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-02-02
  • python中二維陣列的變換實(shí)例

    python中二維陣列的變換實(shí)例

    這篇文章主要介紹了python中二維陣列的變換實(shí)例,通過(guò)對(duì)比兩種不同的方法分析了二維陣列變換的實(shí)現(xiàn)方法,需要的朋友可以參考下
    2014-10-10

最新評(píng)論