自动获取项目中的url


Example/settings.py

# 自动获取项目中URL所剔除的名单
AUTO_DISCOVER_EXCLUDE = [
    '/admin/.*',
    '/login/',
]

rbac/service/routes.py

"""自动获取项目中的URL"""
from collections import OrderedDict
from django.conf import settings
from django.utils.module_loading import import_string
from django.urls import URLResolver, URLPattern
import re


def check_url_exclude(url):
    """
    排除一些特定的URL
    :param url:
    :return:
    """
    for regex in settings.AUTO_DISCOVER_EXCLUDE:
        if re.match(regex, url):
            return True


def recursion_urls(pre_namespace, pre_url, urlpatterns, url_ordered_dict):
    """
    递归的去获取URL
    :param pre_namespace: namespace前缀,以后用于拼接name
    :param pre_url: url前缀,以后用于拼接url
    :param urlpatterns: 路由关系列表
    :param url_ordered_dict: 用于保存递归中获取的所有路由
    :return:
    """
    # re_path(r"^", include("app01.urls")),  路由分发URLResolver
    # re_path(r"^/xxx/xx", lambda x: x),  非路由分发,对应的是视图函数,那么是URLPattern
    for item in urlpatterns:
        if isinstance(item, URLPattern):  # 非路由分发,将路由添加到url_ordered_dict
            if not item.name:
                continue
            if pre_namespace:
                name = "%s:%s" % (pre_namespace, item.name)
            else:
                name = item.name
            url = pre_url + item.pattern.regex.pattern  # /^rbac/^user/edit/(?P\d+)/$
            url = url.replace('^', '').replace('$', '')  # /rbac/user/edit/(?P\d+)/
            if check_url_exclude(url):
                continue
            url_ordered_dict[name] = {"name": name, "url": url}
        elif isinstance(item, URLResolver):  # 路由分发,递归操作
            if pre_namespace:
                if item.namespace:
                    namespace = "%s:%s" % (pre_namespace, item.namespace)
                else:
                    namespace = item.namespace
            else:
                if item.namespace:
                    namespace = item.namespace
                else:
                    namespace = None
            recursion_urls(namespace, pre_url + item.pattern.regex.pattern, item.url_patterns, url_ordered_dict)


def get_all_url_dict():
    """
    获取项目中所有的URL(必须有name别名)
    :return:
    """
    url_ordered_dict = OrderedDict()
    md = import_string(settings.ROOT_URLCONF)  # from Example.Example import urls
    recursion_urls(None, '/', md.urlpatterns, url_ordered_dict)  # 递归去获取所有的路由
    return url_ordered_dict

rbac/views/menu.py

from rbac.service.routes import get_all_url_dict


def multi_permissions(request):
    """
    批量操作权限
    :param request:
    :return:
    """
    # 获取项目中所有的URL
    all_url_dict = get_all_url_dict()
    for k, v in all_url_dict.items():
        print(k, '---', v)  # rbac:role_list --- {'name': 'rbac:role_list', 'url': '/rbac/role/list/'}
    return HttpResponse("...")


"""
rbac:role_list --- {'name': 'rbac:role_list', 'url': '/rbac/role/list/'}
rbac:role_add --- {'name': 'rbac:role_add', 'url': '/rbac/role/add/'}
rbac:role_edit --- {'name': 'rbac:role_edit', 'url': '/rbac/role/edit/(?P\\d+)/'}
rbac:role_del --- {'name': 'rbac:role_del', 'url': '/rbac/role/del/(?P\\d+)/'}
rbac:user_list --- {'name': 'rbac:user_list', 'url': '/rbac/user/list/'}
rbac:user_add --- {'name': 'rbac:user_add', 'url': '/rbac/user/add/'}
rbac:user_edit --- {'name': 'rbac:user_edit', 'url': '/rbac/user/edit/(?P\\d+)/'}
rbac:user_del --- {'name': 'rbac:user_del', 'url': '/rbac/user/del/(?P\\d+)/'}
rbac:user_reset_pwd --- {'name': 'rbac:user_reset_pwd', 'url': '/rbac/user/reset/password/(?P\\d+)/'}
rbac:menu_list --- {'name': 'rbac:menu_list', 'url': '/rbac/menu/list/'}
rbac:menu_add --- {'name': 'rbac:menu_add', 'url': '/rbac/menu/add/'}
rbac:menu_edit --- {'name': 'rbac:menu_edit', 'url': '/rbac/menu/edit/(?P\\d+)/'}
rbac:menu_del --- {'name': 'rbac:menu_del', 'url': '/rbac/menu/del/(?P\\d+)/'}
rbac:second_menu_add --- {'name': 'rbac:second_menu_add', 'url': '/rbac/second/menu/add/(?P\\d+)/'}
rbac:second_menu_edit --- {'name': 'rbac:second_menu_edit', 'url': '/rbac/second/menu/edit/(?P\\d+)/'}
rbac:second_menu_del --- {'name': 'rbac:second_menu_del', 'url': '/rbac/second/menu/del/(?P\\d+)/'}
rbac:permission_add --- {'name': 'rbac:permission_add', 'url': '/rbac/permissions/add/(?P\\d+)/'}
rbac:permission_edit --- {'name': 'rbac:permission_edit', 'url': '/rbac/permissions/edit/(?P\\d+)/'}
rbac:permission_del --- {'name': 'rbac:permission_del', 'url': '/rbac/permissions/del/(?P\\d+)/'}
rbac:multi_permissions --- {'name': 'rbac:multi_permissions', 'url': '/rbac/multi/permissions/'}
"""