自动发现项目中的URL,django1版本和django2版本

一、django 1 版本

routers.py

import re
from collections import OrderedDict

from django.conf import settings
from django.utils.module_loading import import_string  # 根据字符串的形式,帮我们去导入模块
from django.urls import RegexURLResolver, RegexURLPattern # 路由分发:URLResolver。不是路由分发:URLPattern

def check_url_exclude(url):
    """
    排除一些特定的url
    :param url:
    :return:
    """
    exclude_url = [
        ‘/admin.*‘,
        ‘/login/‘
    ]
    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):
    """

    :param pre_namespace: namespace前缀(rbac:......),以后用于拼接name
    :param pre_url: url的前缀(rbac/......),以后用于拼接url
    :param urlpatterns: 路由关系列表
    :param url_ordered_dict: 用于保存递归中获取的所有路由
    :return:
    """
    for item in urlpatterns:
        if isinstance(item,RegexURLPatter):  # 非路由分发,将路由添加到url_ordered_dict
            if not item.name:  # url中反向命名的name
                continue
            if pre_namespace:
                name = f"{pre_namespace}:{item.name}"
            else:
                name = item.name
            url = pre_url + item.item._regex  # /^rbac/^user/edit/(?P<pk>\d_+)/$
            url = url.replace(‘^‘, ‘‘).replace(‘$‘, ‘‘)  # /rbac/user/edit/(?P<pk>\d_+)/

            if check_url_exclude(url):
                continue
            url_ordered_dict[name] = {‘name‘: name, ‘url‘: url}

        elif isinstance(item,  RegexURLResolver):  # 路由分发,进行递归操作
            if pre_namespace:
                if item.namespace:
                    namespace = f"{pre_namespace}:{item.namespace}"
                else:
                    namespace = item.namespace
            else:
                if item.namespace:
                    namespace = item.namespace
                else:
                    namespace = None
            recursion_urls(namespace, pre_url + item.regex.pattern, item.url_patterns, url_ordered_dict)

def get_all_url_dict():
    """
    获取项目中所有的URL(必须有name别名)
    :return:
    """
    url_ordered_dict = OrderedDict()
    """
    {
        ‘rbac:menu_list‘:{name:‘rbac:menu_list‘,url:‘xxxxx/yyyy/menu/list‘}
    }
    """

    md = import_string(settings.ROOT_URLCONF)  # from permision_learn import urls

    recursion_urls(None, ‘/‘, md.urlpatterns, url_ordered_dict)  # 递归的去获取所有的路由。根目录没有namespace,根路由用/

    return url_ordered_dict

views.py

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)

    return HttpResponse(‘....‘)

二、django 2版本

django 2版本有些坑,和django 1版本的用法略有不同。谷歌查了半天,只查到模块名变了,没查到用法。没办法,只能取看源码,只能看到参数名变了,瞎试了试,居然能用。

routers.py

import re
from collections import OrderedDict

from django.conf import settings
from django.utils.module_loading import import_string  # 根据字符串的形式,帮我们去导入模块
from django.urls import URLPattern, URLResolver  # 路由分发:URLResolver。不是路由分发:URLPattern

def check_url_exclude(url):
    """
    排除一些特定的url
    :param url:
    :return:
    """
    exclude_url = [
        ‘/admin.*‘,
        ‘/login/‘
    ]
    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):
    """

    :param pre_namespace: namespace前缀(rbac:......),以后用于拼接name
    :param pre_url: url的前缀(rbac/......),以后用于拼接url
    :param urlpatterns: 路由关系列表
    :param url_ordered_dict: 用于保存递归中获取的所有路由
    :return:
    """
    for item in urlpatterns:
        if isinstance(item, URLPattern):  # 非路由分发,将路由添加到url_ordered_dict
            if not item.name:  # url中反向命名的name
                continue
            if pre_namespace:
                name = f"{pre_namespace}:{item.name}"
            else:
                name = item.name
            url = pre_url + item.pattern.regex.pattern  # /^rbac/^user/edit/(?P<pk>\d_+)/$
            url = url.replace(‘^‘, ‘‘).replace(‘$‘, ‘‘)  # /rbac/user/edit/(?P<pk>\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 = f"{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()
    """
    {
        ‘rbac:menu_list‘:{name:‘rbac:menu_list‘,url:‘xxxxx/yyyy/menu/list‘}
    }
    """

    md = import_string(settings.ROOT_URLCONF)  # from permision_learn import urls

    recursion_urls(None, ‘/‘, md.urlpatterns, url_ordered_dict)  # 递归的去获取所有的路由。根目录没有namespace,根路由用/

    return url_ordered_dict

views.py

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)

    return HttpResponse(‘....‘)

原文地址:https://www.cnblogs.com/lshedward/p/10467931.html

时间: 2024-11-05 21:38:45

自动发现项目中的URL,django1版本和django2版本的相关文章

权限组件(12):自动发现项目中有别名的URL

自动发现项目中所有有别名的URL,效果如下: customer_list {'name': 'customer_list', 'url': '/customer/list/'} customer_add {'name': 'customer_add', 'url': '/customer/add/'} customer_edit {'name': 'customer_edit', 'url': '/customer/edit/(?P<cid>\\d+)/'} customer_del {'na

Django自动获取项目中的全部URL

from django.utils.module_loading import import_string from django.conf import settings # for django 1.0 # from django.urls import RegexURLResolver, RegexURLPattern # for django 2.0 from django.urls.resolvers import URLResolver, URLPattern def recursi

验证码自动填充项目中观察者模式分析

观察者模式 观察者模式定义了对象之间的一对多依赖,当一个对象状态发生改变时,其依赖者便会收到通知并做相应的更新.其原则是:为交互对象之间松耦合.以松耦合方式在一系列对象之间沟通状态,我们可以独立复用主题(Subject)/可观测者(Observable)和观测者(Observer),即只要遵守接口规则改变其中一方并不会影响到另一方.这也是其主要的设计原则. 举个例子:老师留高软作业,所有学生收到作业信息.老师对应多个学生,留作业是发生的变化,学生会收到作业信息.老师(或学生)通常步行去学校,今天

安装使用Entity Framework Power Tool Bate4 (Code First)从已建好的数据自动生成项目中的对应Model(新手贴,望各位大侠给予指点)

从开始学习使用MVC以后,同时也开始接触EF,很多原理都不是太懂,只知道安装了EF以后,点击哪里可以生成数据库对应的Model,不用再自己手写Model.这里记录的就是如何从已建立好的数据库生成项目代码中的Model.一是记录这种操作方式,二是方便那些和我一样的菜鸟同学快速生成Model.(其中的问题希望园里的大侠们给予指点!) 第一步:安装Entity Framework Power Tools Beta 4,打开VS2013——工具——扩展与更新 第二步:选择左边菜单的联机——在右上的搜索栏

zabbix主动和被动模式、添加监控主机和自动以模板、处理图形中的乱码、自动发现

主动模式和被动模式 主动或被动都是相对于客户端来讲的 被动模式,服务端会主动连接客户端获取监控项目数据,客户端被动的接受连接,并把监控信息传递给服务端. 服务端要到所有的客户端上取数据再返回放到数据库. 主动模式,客户端会主动把监控数据汇报给服务端,服务端只负责接受即可. 定义完监控项目之后,客户端就会根据设定的策略去采集相关项目的数据(cpu使用率.网卡流量.负载等),到点就把数据上传给服务端,服务端再把数据传到数据库. 当客户端数量非常多时,建议使用主动模式,这样可以降低服务端的压力. 服务

zabbix自动发现监控tomcat健康页面

一.背景 公司系统平台有10几个tomcat服务,由于需要服务保持全年无间断服务,特在tomcat中嵌入专门的监控页面,在curl 专用页面返回值为200时,则认定服务正常运行,否则报警发送专门的监控运维的邮箱. 二.原理 正常的tomcat健康状态监控页面如下图 我们利用如下命令判断返回值是否为200 shell>/usr/bin/curl -o /dev/null -s --connect-timeout 5 -w '%{http_code}' http://10.0.0.107:9100/

Zabbix自动发现与自动注册、自定义监控的实现

一.自动发现与自动注册 Zabbix的发现主要包括三种类型: 1)Zabbix的自动网络发现 Zabbix提供非常有利和灵活的自动网络发现功能.通过网络发现,可以实现加速Zabbix部署.简化管理.在不断变化的环境中使用Zabbix而不需要过多的管理: zabbix网络发现基于以下信息:1)IP段自动发现:2)可用的外部服务(FTP.SSH.WEB.TCP等):3)从Zabbix客户端接收到信息:4)从SNMP客户端接收到信息: 1)自动发现原理 网络发现主要由两个步骤组成:发现和动作: Zab

zabbix自动发现实现批量监控docker状态

最近在搞zabbix监控docker以及docker内部应用状态信息,网上找的资料好少,只找到了一个大神的一篇文章,用的是python实现监控docker容器的基本状态,我在他给的脚本基础上进行修改,另外,增加了docker内部常用应用的状态监控,目前在测试环境上部署成功了,具体还需要在线上环境部署后才能检验出效果如何. 好了,根据惯例,废话讲完了,开始进入正题了. 首先,介绍下该监控套件有三个脚本,一个是自动发现主机上的docker容器脚本,另一个是用python写的获取每个docker容器的

Ubuntu18.0 解决python虚拟环境中不同用户下或者python多版本环境中指定虚拟环境的使用问题

一. 不同用户下配置virtualenvwrapper的问题 问题描述: 安装virtualnev和virtualnevwrapper之后,在.bashrc进行virtualenvwrapper的相关配置后重新加载.bashrc文件时报错. 报错内容大致如下: /usr/bin/python: No module named virtualenvwrapper virtualenvwrapper.sh: There was a problem running the initialization