Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 确定完整的Django url配置_Python_Django_Url - Fatal编程技术网

Python 确定完整的Django url配置

Python 确定完整的Django url配置,python,django,url,Python,Django,Url,有没有办法获得完整的django url配置 例如,Django的调试404页面没有显示包含的url配置,因此这不是完整的配置 答案:感谢阿拉斯代尔,这里有一个示例脚本: import urls def show_urls(urllist, depth=0): for entry in urllist: print(" " * depth, entry.regex.pattern) if hasattr(entry, 'url_p

有没有办法获得完整的django url配置

例如,Django的调试404页面没有显示包含的url配置,因此这不是完整的配置


答案:感谢阿拉斯代尔,这里有一个示例脚本:

import urls

def show_urls(urllist, depth=0):
    for entry in urllist:
        print("  " * depth, entry.regex.pattern)
        if hasattr(entry, 'url_patterns'):
            show_urls(entry.url_patterns, depth + 1)

show_urls(urls.urlpatterns)

如果您在调试模式下运行Django(设置中有
debug=True
),然后键入一个不存在的URL,您将获得一个错误页面,列出完整的URL配置。

如果您在调试模式下运行Django(设置中有
debug=True
)然后键入一个不存在的URL,您将得到一个错误页面,其中列出了完整的URL配置。

您是在查找已评估的URL还是未评估的URL,如调试模式所示?对于evaluated,django.contrib.sitemaps可以帮助您,否则可能需要对django的代码进行反向工程。

您是在寻找已评估的URL还是未评估的URL,如调试模式所示?对于evaluated,django.contrib.sitemaps可以帮助您实现这一点,否则可能需要对django的代码进行反向工程。

django是Python,因此内省是您的朋友

在shell中,导入
url
。通过循环浏览
url.urlpatterns
,并深入浏览尽可能多的包含url配置的层,您可以构建完整的url配置

import urls
urls.urlpatterns
列表
url.urlpatterns
包含
RegexURLPattern
RegexURLResolver
对象

对于
RegexURLPattern
对象
p
,可以使用

p.regex.pattern
q.regex.pattern
对于表示包含的url配置的
RegexURLResolver
对象
q
,可以使用

p.regex.pattern
q.regex.pattern
然后使用

q.url_patterns

它将返回
RegexURLResolver
RegexURLPattern
对象的进一步列表。

Django是Python,因此内省是您的朋友

在shell中,导入
url
。通过循环浏览
url.urlpatterns
,并深入浏览尽可能多的包含url配置的层,您可以构建完整的url配置

import urls
urls.urlpatterns
列表
url.urlpatterns
包含
RegexURLPattern
RegexURLResolver
对象

对于
RegexURLPattern
对象
p
,可以使用

p.regex.pattern
q.regex.pattern
对于表示包含的url配置的
RegexURLResolver
对象
q
,可以使用

p.regex.pattern
q.regex.pattern
然后使用

q.url_patterns
这将返回
RegexURLResolver
RegexURLPattern
对象的进一步列表。

冒着添加“我也是”答案的风险,我发布了上述提交脚本的修改版本,该脚本为您提供了一个视图,列出了项目中的所有URL,稍微经过修饰并按字母顺序排序,以及他们所称的观点。与其说是生产页面,不如说是开发人员工具

def all_urls_view(request):
    from your_site.urls import urlpatterns #this import should be inside the function to avoid an import loop
    nice_urls = get_urls(urlpatterns) #build the list of urls recursively and then sort it alphabetically
    return render(request, "yourapp/links.html", {"links":nice_urls})

def get_urls(raw_urls, nice_urls=[], urlbase=''):
    '''Recursively builds a list of all the urls in the current project and the name of their associated view'''
    from operator import itemgetter
    for entry in raw_urls:
        fullurl = (urlbase + entry.regex.pattern).replace('^','')
        if entry.callback: #if it points to a view
            viewname = entry.callback.func_name
            nice_urls.append({"pattern": fullurl, 
                  "location": viewname})
        else: #if it points to another urlconf, recur!
            get_urls(entry.url_patterns, nice_urls, fullurl)
    nice_urls = sorted(nice_urls, key=itemgetter('pattern')) #sort alphabetically
    return nice_urls
以及模板:

<ul>
{% for link in links %}
<li>
{{link.pattern}}   -----   {{link.location}}
</li>
{% endfor%}
</ul>
    {%用于链接中的链接%}
  • {{link.pattern}------{{link.location}
  • {%endfor%}
如果您想真正地发挥想象力,您可以为任何接受变量传递到视图的正则表达式呈现带有输入框的列表(同样作为开发人员工具,而不是生产页面)

冒着添加“我也是”答案的风险,我发布了上述提交脚本的一个修改版本,该版本提供了一个视图,列出了项目中的所有URL,按字母顺序进行了一些修饰和排序,以及它们调用的视图。与其说是生产页面,不如说是开发人员工具

def all_urls_view(request):
    from your_site.urls import urlpatterns #this import should be inside the function to avoid an import loop
    nice_urls = get_urls(urlpatterns) #build the list of urls recursively and then sort it alphabetically
    return render(request, "yourapp/links.html", {"links":nice_urls})

def get_urls(raw_urls, nice_urls=[], urlbase=''):
    '''Recursively builds a list of all the urls in the current project and the name of their associated view'''
    from operator import itemgetter
    for entry in raw_urls:
        fullurl = (urlbase + entry.regex.pattern).replace('^','')
        if entry.callback: #if it points to a view
            viewname = entry.callback.func_name
            nice_urls.append({"pattern": fullurl, 
                  "location": viewname})
        else: #if it points to another urlconf, recur!
            get_urls(entry.url_patterns, nice_urls, fullurl)
    nice_urls = sorted(nice_urls, key=itemgetter('pattern')) #sort alphabetically
    return nice_urls
以及模板:

<ul>
{% for link in links %}
<li>
{{link.pattern}}   -----   {{link.location}}
</li>
{% endfor%}
</ul>
    {%用于链接中的链接%}
  • {{link.pattern}------{{link.location}
  • {%endfor%}

如果您想真正地发挥想象力,您可以为任何接受变量传递到视图的正则表达式呈现带有输入框的列表(同样作为开发人员工具,而不是生产页面)

获取已注册URL的完整列表的最简单方法是安装,然后检查“视图”部分。非常容易设置,并且可以在所有模板标签、模型等上完全浏览文档。

获取注册URL完整列表的最简单方法是安装,然后检查“视图”部分。非常容易设置,还可以让您在所有模板标签、模型等上完全浏览文档。

Django extensions提供了一个实用程序,作为manage.py命令来完成此操作

pip install django-extensions
然后在
settings.py
中将
django\u扩展添加到已安装的应用程序中。然后从控制台键入以下命令

python manage.py show_urls

Django extensions提供了一个实用程序,可以作为manage.py命令来完成这项工作

pip install django-extensions
然后在
settings.py
中将
django\u扩展添加到已安装的应用程序中。然后从控制台键入以下命令

python manage.py show_urls

这个问题有点老,但我遇到了同样的问题,我想我会讨论我的解决方案。一个给定的Django项目显然需要一种了解其所有URL的方法,并且需要能够做以下几件事:

  • 从url->视图映射
  • 从命名url->url映射(然后使用1获取视图)
  • 从视图名称->url映射(然后使用1获取视图)
  • Django主要通过一个名为
    RegexURLResolver
    的对象来实现这一点

  • RegexURLResolver.resolve(从url->视图映射)
  • RegexURLResolver.reverse
  • 您可以通过以下方式获得这些对象之一:

    from my_proj import urls
    from django.core.urlresolvers import get_resolver
    resolver = get_resolver(urls)
    
    for view, regexes in resolver.reverse_dict.iteritems():
        print "%s: %s" % (view, regexes)
    
    然后,您可以通过以下方式简单地打印URL:

    from my_proj import urls
    from django.core.urlresolvers import get_resolver
    resolver = get_resolver(urls)
    
    for view, regexes in resolver.reverse_dict.iteritems():
        print "%s: %s" % (view, regexes)
    
    也就是说,Alasdair的解决方案非常好,并且有一些优势,因为它打印出了比这种方法更好的内容。但是了解并掌握
    RegexURLResolver
    对象是一件很好的事情,特别是如果您是